如何使用“sudo”将输出重定向到我没有写权限的位置?[已关闭]
如何使用“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日
你的命令无法执行,因为输出重定向是由你的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 -a
或tee --append
(最后一个选项是针对GNU coreutils的)。
感谢Jd,Adam J. Forster和Johnathan提供的第二、第三和第四种解决方法。