如何使用 sudo 将文本插入 root 拥有的文件中?

如何使用 sudo 将文本插入 root 拥有的文件中?

可能的重复:
将标准输出重定向到您没有写入权限的文件

运行类似命令sudo echo 'text' >> /file.txt会失败:

bash: /file.txt: Permission denied

答案1

这不起作用,因为重定向是由 shell 执行的,而不是由它所应用的命令执行的。但你的 shell 并没有以 root 身份运行,只是以 rootecho 'text'身份运行。

当您需要具有 root 权限才能写入文件但不需要生成数据时,常见的技巧是使用tee

echo 'text' | sudo tee -a /file.txt

tee也将文本打印到标准输出。为了将其静音,使其行为更类似于 shell 附加 ( >>),请将 stdout 路由到/dev/null

echo 'text' | sudo tee -a /file.txt > /dev/null

如果您确实需要 root 权限来生成数据,您可以运行两个单独的sudo命令,或者在内部运行 shellsudo并在那里进行重定向(小心引用)。

sudo echo 'text' | sudo tee -a /file.txt
sudo sh -c 'echo "text" >>/file.txt'

当覆盖而不是追加时,如果您习惯 shell 拒绝使用运算符>( set -o noclobber) 截断现有文件,请记住此保护将不适用。sudo sh -c 'echo >/etc/passwd'并且sudo tee /etc/passwd将覆盖/etc/passwd,您需要sudo sh -o noclobber -c 'echo >/etc/passwd'将该noclobber设置也应用到sh启动者sudo

答案2

您告诉 bash 打开一个文件并将命令的输出附加sudo echo 'text'到该文件,这当然不起作用,因为您的 bash 以非 root 身份运行。交互式地,我通常会运行sudo -s来解决这个问题(从那时起 shell 以 root 身份运行并且可以打开文件)。或者,您可以运行sudo sh -c "echo 'text' >> /file.txt",它也可以工作,但是如果您有复杂的表达式,所有插值/转义可能会产生干扰,这会有点麻烦。

相关内容