我有一个名为“s”的文件,由 root 拥有。我想使用 sudo 将其内容替换为其他内容,但失败:“sudo ls -l > s”授予权限被拒绝。但是,当我在 sudo su 之后执行相同操作时,一切正常。
我想了解为什么我的 sudo 命令失败?我怀疑只有 ls 是以 root 权限运行的,而不是 ">" 操作,所以它失败了。如果是这样的话我该如何 sudo 呢?
背景:我想在脚本中使用它,所以我不能在其中使用 sudo su 。
作为参考,这是我尝试过的:
xropi@xropi-VirtualBox2:~/w$ ls -l
total 4
-rw-r--r-- 1 root root 18 Dec 25 01:33 s
xropi@xropi-VirtualBox2:~/w$ cat s
asdf
sadf
dsf
sdf
xropi@xropi-VirtualBox2:~/w$ sudo ls -l > s
bash: s: Permission denied
但是当我使用 sudo su 时,一切正常:
xropi@xropi-VirtualBox2:~/w$ sudo su
root@xropi-VirtualBox2:/home/xropi/w# ls -l > s
root@xropi-VirtualBox2:/home/xropi/w# cat s
total 0
-rw-r--r-- 1 root root 0 Dez 25 01:34 s
root@xropi-VirtualBox2:/home/xropi/w#
答案1
输出重定向由您的 shell 评估,而不是由 sudo 运行的进程评估。 shell 在执行命令之前解释诸如重定向 (>) 之类的内容,因此 sudo 不知道您正在重定向到文件,shell 只是将命令的 stdout 文件句柄附加到文件而不是 tty。
由于您的 shell 在您的帐户下运行,因此它会尝试以您的帐户写入文件,这就是它失败的原因。
如果您想以 root 身份写入文件,请使用类似 的内容tee
,如本例所示:
ls -l | sudo tee s
这样,不是重定向,而是将 的输出通过ls -l
管道传输到tee
命令,并且它在 sudo 下以 root 身份运行。
如果您绝对想使用 shell 重定向,则需要执行以下操作:
sudo sh -c ‘ls -l > s’
它只运行一个 shell(以 root 身份),基本上执行您在“sudo su”中运行的操作,就像一个衬垫一样。