Linux重定向权限不够的解决方案

在使用 catecho 等命令,将一些内容添加到root权限的文件,比如/etc/hosts时,系统会报出“权限不够”的错误。

原因分析

以向/etc/hosts中添加一条记录为例,通常代码写为

1
2
sudo echo  "220.181.111.232 www.baidu.com" >> /etc/hosts
-bash: test.asc: Permission denied

此时,bash 拒绝这么做会提示权限不够,是因为重定向符号 >>> 也是 bash 的命令。由于使用 sudo 只是让 echo 命令具有了 root 权限,但是没有让 >>> 命令也具有 root 权限,所以 bash 会认为这两个命令都没有向/etc/hosts写入信息的权限。

解决方法

使用命令sh -c

sh -c 命令,可以让 bash 将一个字串作为完整的命令来执行,这样就可以将 sudo 的影响范围扩展到整条命令。具体用法如下:

1
sudo sh -c 'echo  "220.181.111.232 www.baidu.com" >> /etc/hosts'

使用命令tee

利用管道和 tee 命令,该命令可以从标准输入中读入信息并将其写入标准输出或文件中,具体用法如下:

1
echo  "220.181.111.232 www.baidu.com" | sudo tee -a /etc/hosts

注意: tee 命令的 -a 选项的作用等同于 >> 命令。如果去除该选项,那么 tee 命令的作用就等同于 > 命令。

参考文章