我在我的 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 处理,而不是原始情况的一半。