为什么 root 可以做到这一点,而 sudo 却不能呢?

为什么 root 可以做到这一点,而 sudo 却不能呢?

我在我的 Debian 机器上设置为 a sudoer,我一直使用它来安装软件等...我遇到了这个有趣的情况,我对此感到摸不着头脑:

我尝试使用以下命令在 apt 中启用精美的进度条:

sudo echo 'Dpkg::Progress-Fancy "1";' > /etc/apt/apt.conf.d/99progressbar

我有权限问题:

/etc/apt/apt.conf.d/99progressbar: Permission denied

但是,如果我su然后运行命令,一切都会正常。

为什么会这样呢?

答案1

因为

 sudo cmd > file

被解释为

(sudo cmd) > file

通过你的外壳。即重定向是作为您自己的用户完成的。

我解决这个问题的方法是使用

cmd | sudo tee file

添加:这还将在您的控制台上显示 的输出cmd,如果您不希望这样,则必须重定向它。

答案2

据我所知,>是 shell 本身的命令(重定向是由非 root shell 本身完成的)当您使用时su,它作为 root shell 运行,允许您重定向 root 拥有的文件

答案3

sudo有问题,因为它运行命令部分。重定向后,sudo不再有效。

你可以这样做:

sudo bash -c "Your commands here > output_file"

按照您使用它们的嵌套顺序,小心地转义引号之间的命令中的单引号或双引号。

编辑:

更深入一点的详细解释

当您运行脚本时,您实际上是在创建一个新的子 shell,并且您的脚本在该子 shell 中运行,但输出返回到当前 shell。运行此脚本的新子 shell 是以sudo特权运行的,因此脚本可以以 root 身份有效运行。但是当运行完成时,shell 退出并且你sudo会 * pooof * 。输出返回到您当前的非特权 shell。如果您期望将其写入特权位置,则不会发生。因此,在定义良好的 shell 内运行新 shell 和整个 enchilada 就bash可以实现这一点。因为,此时,您的命令和输出都由sudo启用的 shell 处理,而不是原始情况的一半。

相关内容