使用 sudo 运行复杂命令
发布于 2009年3月30日
如果您使用 sudo 以 root 权限运行命令,您可能遇到过“权限被拒绝”的问题,当管道的一部分或命令的一部分以 root 权限运行时。
这将失败,并显示“权限被拒绝”,因为该文件只能由 root 写入
$ echo 12000 > /proc/sys/vm/dirty_writeback_centisecs
但是,这也会失败
$ sudo echo 12000 > /proc/sys/vm/dirty_writeback_centisecs
为什么?由于 sudo 的缘故,/bin/echo 程序以 root 权限运行,但是将 echo 的输出重定向到 root 专有文件的 shell 仍然以您的身份运行。您的当前 shell 在 sudo 启动之前进行重定向。
解决方案是在 sudo 下运行整个管道。有几种方法可以做到这一点,但我更喜欢
echo "echo 12000 > /proc/sys/vm/dirty_writeback_centisecs" | sudo sh
这样,我可以在管道字符之前输入所有内容,并查看我将要以 root 身份运行的内容,然后按向上箭头并添加| sudo sh来真正执行它。对于简短、明显的管道来说,这不是什么大问题,但是当您以 root 身份构建更复杂的命令时,在运行它之前先查看它更安全。