可能的重复:
将标准输出重定向到您没有写入权限的文件
运行类似命令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"
,它也可以工作,但是如果您有复杂的表达式,所有插值/转义可能会产生干扰,这会有点麻烦。