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

新手上路,请多包涵

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

问题是,这个人为的例子不起作用:

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

我刚收到回复:

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

我怎样才能让它工作?

原文由 Jonathan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 851
2 个回答

您的命令不起作用,因为重定向是由您的 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 提供的第二个、第三个和第四个解决方案。

原文由 Cristian Ciupitu 发布,翻译遵循 CC BY-SA 3.0 许可协议

这里有人刚刚建议 sudoing tee:

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

这也可用于将任何命令重定向到您无权访问的目录。它之所以有效,是因为 tee 程序实际上是一个“回显到文件”程序,并且重定向到 /dev/null 是为了阻止它也输出到屏幕,以保持它与上面最初的人为示例相同。

原文由 Jonathan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题