我有一个由 root 拥有的名为“s”的文件。我想使用 sudo 将其内容替换为其他内容,但失败:“sudo ls -l > s”授予权限被拒绝。但是,当我在 sudo su 之后执行相同操作时,一切正常。
我想知道为什么我的 sudo 命令失败了?我怀疑只有 ls 以 root 权限运行,而不是 ">" 操作,所以它失败了。如果是这种情况,我该怎么做?
背景:我想在脚本中使用它,所以我不能在其中使用 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#
输出重定向由您的 shell 评估,而不是由 sudo 运行的进程。shell 在评估命令之前会解释重定向 (>) 之类的内容,因此 sudo 不知道您正在重定向到文件,shell 只是将命令的 stdout 文件句柄附加到文件而不是 tty。
由于您的外壳程序在您的帐户下运行,它试图以您的帐户写入文件,这就是它失败的原因。
如果您想以 root 身份写入文件,请使用类似 的内容
tee
,如本例所示:这样,输出不是重定向,而是通过
ls -l
管道传输到tee
命令,并且它在 sudo 下以 root 身份运行。如果您绝对想使用 shell 重定向,则需要执行以下操作:
它只是运行一个shell(作为root)基本上做你在'sudo su'中运行的东西,就像一个衬里一样。