如何使用sudo将输出重定向到我没有写权限的位置?

时间:2020-03-05 18:58:37  来源:igfitidea点击:

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

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

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

我刚收到回复:

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

我怎样才能使它正常工作?

解决方案

回答

编写脚本怎么样?

文件名:myscript

#!/bin/sh

/bin/ls -lah /root > /root/test.out

# end script

然后使用sudo运行脚本:

sudo ./myscript

回答

使sudo运行shell,如下所示:

sudo sh -c "echo foo > ~root/out"

回答

命令不起作用,因为重定向是由外壳执行的,该外壳无权写入/ 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提供的第二,第三和第四种解决方案。

回答

每当我必须做这样的事情时,我就会成为root:

# sudo -s
# ls -hal /root/ > /root/test.out
# exit

这可能不是最好的方法,但是它可以工作。

回答

也许我们只能以sudo身份访问某些程序/路径?那就没有办法做你想做的事。 (除非我们会以某种方式破解它)

如果不是这种情况,那么也许我们可以编写bash脚本:

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

ctrl+d

chmod a+x myscript.sh
sudo myscript.sh

希望对我们有所帮助。

回答

这里有人建议对tee进行sudoing:

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

这也可以用于将任何命令重定向到我们无权访问的目录。之所以起作用,是因为tee程序实际上是一个"回显文件"程序,并且重定向到/ dev / null就是要停止它并同时将其输出到屏幕,以使其与上面的原始设计示例相同。

回答

问题在于该命令在sudo下运行,但是重定向在用户下运行。这是由Shell完成的,我们对此几乎无能为力。

sudo command > /some/file.log
`-----v-----'`-------v-------'
   command       redirection

绕过此问题的常用方法是:

  • 将命令包装在我们在sudo下调用的脚本中。如果命令和/或者日志文件发生更改,则可以使脚本将这些作为参数。例如:
sudo log_script command /log/file.txt
  • 调用shell并使用-c作为参数传递命令行。这对于一次性复合命令特别有用。例如:
sudo bash -c "{ command1 arg; command2 arg; } > /log/file.txt"