协慌网

登录 贡献 社区

如何使用 sudo 将输出重定向到我无权写入的位置?

我已经在我们的一个开发 RedHat linux 盒子上获得了 sudo 访问权限,而且我似乎发现自己经常需要将输出重定向到我通常没有写入权限的位置。

麻烦的是,这个人为的例子不起作用:

sudo ls -hal /root/ > /root/test.out

我刚收到回复:

-bash: /root/test.out: Permission denied

我怎样才能让它发挥作用?

答案

您的命令不起作用,因为重定向是由您的 shell 执行的,该 shell 没有写入/root/test.out的权限。 sudo 执行输出的重定向。

有多种解决方案:

  • 使用 sudo 运行 shell 并使用-c选项将命令提供给它:

    sudo sh -c 'ls -hal /root/ > /root/test.out'
  • 使用您的命令创建脚本并使用 sudo 运行该脚本:

    #!/bin/sh
    ls -hal /root/ > /root/test.out

    运行sudo ls.sh如果您不想创建临时文件,请参阅 Steve Bennett 的答案

  • 使用sudo -s启动 shell 然后运行命令:

    [nobody@so]$ sudo -s
    [root@so]# ls -hal /root/ > /root/test.out
    [root@so]# ^D
    [nobody@so]$
  • 使用sudo tee (如果在使用-c选项时必须逃避很多):

    sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null

    需要重定向到/dev/null才能阻止tee输出到屏幕。要追加而不是覆盖输出文件( >> ),请使用tee -atee --append (最后一个特定于GNU coreutils )。

谢谢JdAdam J. ForsterJohnathan的第二,第三和第四个解决方案。

这里有人刚建议 sudoing tee:

sudo ls -hal /root/ | sudo tee /root/test.out > /dev/null

这也可用于将任何命令重定向到您无权访问的目录。它的工作原理是因为 tee 程序实际上是一个 “回显到文件” 程序,重定向到 / dev / null 是为了阻止它也输出到屏幕以保持它与上面原始设计的例子相同。

我弄清楚自己的一招

sudo ls -hal /root/ | sudo dd of=/root/test.out