当您尝试在没有写入权限的情况下修改文件时,您会收到错误消息:
> touch /tmp/foo && sudo chown root /tmp/foo
> echo test > /tmp/foo
zsh: permission denied: /tmp/foo
Sudoing 没有帮助,因为它以 root 身份运行命令,但 shell 会处理重定向 stdout 并按照您的方式打开文件:
> sudo echo test > /tmp/foo
zsh: permission denied: /tmp/foo
除了以 root 身份打开 shell 并以这种方式操作文件之外,是否有一种简单的方法可以将 stdout 重定向到您无权写入的文件?
> sudo su
# echo test > /tmp/foo
答案1
是的,使用tee
.于是就echo test > /tmp/foo
变成了
echo test | sudo tee /tmp/foo
您还可以附加 ( >>
)
echo test | sudo tee -a /tmp/foo
答案2
将文件的内容替换为echo
(如>
shell 重定向运算符)的输出。
echo test | sudo dd of=/tmp/foo
要在不截断的情况下写入文件(在开头,尽管您可以使用seek
不同的偏移量进行输出)(如1<>
Bourne shell 运算符):
echo test | sudo dd of=/tmp/foo conv=notrunc
要使用 GNU 附加到文件(如>>
)dd
:
echo test | sudo dd of=/tmp/foo oflag=append conv=notrunc
另请参阅 GNUdd
以conv=excl
避免破坏现有文件(如set -o noclobber
POSIX shell 中的文件)以及conv=nocreat
相反的情况(仅更新现有文件)。
答案3
tee
可能是最好的选择,但根据您的情况,这样的事情可能就足够了:
sudo sh -c 'echo test > /tmp/foo'
答案4
sponge
从 moreutils 包中使用。它的优点是不写入标准输出。
echo test | sudo sponge /tmp/foo
使用该-a
选项附加到文件而不是覆盖它。