tsh*_*ang 73 permissions sudo io-redirection
可能的重复:
将标准输出重定向到您没有写权限的文件
运行类似的命令sudo echo 'text' >> /file.txt
失败:
bash: /file.txt: Permission denied
Run Code Online (Sandbox Code Playgroud)
Gil*_*il' 123
这不起作用,因为重定向是由 shell 执行的,而不是由它适用的命令执行的。但是您的 shell 不是以 root 身份运行,而是以 root 身份运行echo 'text'
。
当您需要具有 root 权限来写入文件而不是生成数据时,一个常见的技巧是使用tee
:
echo 'text' | sudo tee -a /file.txt
Run Code Online (Sandbox Code Playgroud)
tee
也将文本打印到标准输出。为了使其静音,使其行为更类似于 shell 附加 ( >>
),请将标准输出路由到/dev/null
:
echo 'text' | sudo tee -a /file.txt > /dev/null
Run Code Online (Sandbox Code Playgroud)
如果您确实需要 root 权限来生成数据,您可以运行两个单独的sudo
命令,或者在里面运行一个 shellsudo
并在那里进行重定向(小心引用)。
sudo echo 'text' | sudo tee -a /file.txt
sudo sh -c 'echo "text" >>/file.txt'
Run Code Online (Sandbox Code Playgroud)
在覆盖而不是追加时,如果您习惯于使用>
运算符 ( set -o noclobber
)拒绝截断现有文件的 shell ,请记住此保护将不适用。sudo sh -c 'echo >/etc/passwd'
并且sudo tee /etc/passwd
会覆盖/etc/passwd
,您需要sudo sh -o noclobber -c 'echo >/etc/passwd'
将该noclobber
设置也应用于sh
开始的sudo
。
您告诉 bash 打开一个文件并将命令的输出附加sudo echo 'text'
到它,这当然不起作用,因为您的 bash 以非 root 身份运行。交互式地,我通常会跑来sudo -s
解决这个问题(从那时起,shell 以 root 身份运行并且可以打开文件)。或者,您可以运行sudo sh -c "echo 'text' >> /file.txt"
,它也可以工作,但是如果您有复杂的表达式,所有插值/转义都会造成干扰,这有点麻烦。