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

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

当您尝试在没有写入权限的情况下修改文件时,您会收到错误消息:

> 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

另请参阅 GNUddconv=excl避免破坏现有文件(如set -o noclobberPOSIX shell 中的文件)以及conv=nocreat相反的情况(仅更新现有文件)。

答案3

tee可能是最好的选择,但根据您的情况,这样的事情可能就足够了:

sudo sh -c 'echo test > /tmp/foo'

答案4

sponge从 moreutils 包中使用。它的优点是不写入标准输出。

echo test | sudo sponge /tmp/foo

使用该-a选项附加到文件而不是覆盖它。

相关内容