为什么我可以使用 sudo vi 更新 root 拥有的文件,但不能使用 sudo echo "Thing" >> file 向其附加一行?

Nic*_*ers 40 sudo redirection file-permissions

我想让正在从另一个网站自动迁移网站的脚本能够将 Includes 附加到 /etc/httpd/conf.d/vhosts.conf 文件。

但是,当我尝试使用 echo 将字符串附加到文件末尾时,我得到了这个:

$ sudo echo "Include thing" >> /etc/httpd/conf.d/vhosts.conf
-bash: /etc/httpd/conf.d/vhosts.conf: Permission denied
Run Code Online (Sandbox Code Playgroud)

但我可以 vi /etc/httpd/conf.d/vhosts.conf,添加该行和 :wq 文件以保存并关闭它。

我错过了什么?

Zor*_*che 78

Sudo 提升了它调用的进程,它不会提升当前 shell 的任何处理,如重定向、通配等。

文件重定向>> /etc/httpd/conf.d/vhosts.conf正在由您当前的shell 处理,该 shell 仍在您当前的权限下运行。

你可以尝试这样的事情。

sudo bash -c 'echo "Include thing" >> /etc/httpd/conf.d/vhosts.conf'
Run Code Online (Sandbox Code Playgroud)

或者

echo "Include thing" | sudo tee -a /etc/httpd/conf.d/vhosts.conf
Run Code Online (Sandbox Code Playgroud)

  • @WGroleau,不,那行不通;`sudo` 需要它的参数是可以使用 `execve()` 系统调用来调用的参数。不能以这种方式调用 shell 复合命令(而带有参数的 shell 是给出复合命令的代码)——所以 `sudo sh -c 'command >> file'` 变为 `execvp("sh" , {"sh", "-c", "command >> file", NULL})`,但是如果没有 `sh -c` 或 `bash -c`,实际上没有任何东西可以将该命令转换为. (6认同)

归档时间:

查看次数:

3536 次

最近记录:

5 年,11 月 前