如何使用“sudo”将输出重定向到我没有写权限的位置?[已关闭]

30 浏览
0 Comments

如何使用“sudo”将输出重定向到我没有写权限的位置?[已关闭]

已关闭。这个问题不符合Stack Overflow指南。目前它不接受答案。


 

此问题似乎与专门的编程问题、软件算法或程序员主要使用的软件工具无关。如果您认为该问题适合在其他Stack Exchange网站上进行回答,您可以留下评论说明问题可能能够得到回答的位置。

社区在4个月前进行了重新开放此问题的审核,并将其关闭:

原关闭原因未解决


改进此问题

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

问题在于,这个人为制造的例子不能正常工作:

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

我只收到了回复:

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

我该如何让它正常工作?

admin 更改状态以发布 2023年5月20日
0
0 Comments

有人刚刚建议使用sudo tee命令:

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

这个命令也可以用来重定向任何命令到你无权访问的目录。它可以这样工作是因为tee程序实际上是一个“echo到文件”的程序,而对/dev/null的重定向是为了防止它也输出到屏幕,以使其与上面原始的虚构示例保持一致。

0
0 Comments

你的命令无法执行,因为输出重定向是由你的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提供的第二、第三和第四种解决方法。

0