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

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

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

我刚刚收到回复:

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

我怎样才能让它工作呢?


当前回答

并不是要白费口功,但是这里有太多的答案使用tee,这意味着您必须将stdout重定向到/dev/null,除非您想在屏幕上看到一个副本。

一个更简单的解决方案是像这样使用cat:

sudo ls -hal /root/ | sudo bash -c "cat > /root/test.out"

请注意重定向是如何放在引号内的,以便由sudo启动的shell而不是运行它的shell来计算它。

其他回答

这是基于tee的答案。为了让事情更简单,我写了一个小脚本(我叫它suwrite),并把它放在/usr/local/bin/ +x权限:

#! /bin/sh
if [ $# = 0 ] ; then
    echo "USAGE: <command writing to stdout> | suwrite [-a] <output file 1> ..." >&2
    exit 1
fi
for arg in "$@" ; do
    if [ ${arg#/dev/} != ${arg} ] ; then
        echo "Found dangerous argument ‘$arg’. Will exit."
        exit 2
    fi
done
sudo tee "$@" > /dev/null

如代码中的USAGE所示,您所要做的就是将输出输出输送到这个脚本,后面跟着所需的超级用户可访问的文件名,如果需要的话,它将自动提示您输入密码(因为它包含sudo)。

echo test | suwrite /root/test.txt

注意,由于这是tee的一个简单包装器,它也将接受tee的-a选项来追加,并且还支持同时写入多个文件。

echo test2 | suwrite -a /root/test.txt
echo test-multi | suwrite /root/test-a.txt /root/test-b.txt

它也有一些简单的保护,防止写入/dev/设备,这是该页的一个评论中提到的一个问题。

让sudo运行一个shell,像这样:

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

写一个脚本怎么样?

Filename: myscript

#!/bin/sh

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

# end script

然后使用sudo运行脚本:

sudo ./myscript

我会这样做:

sudo su -c 'ls -hal /root/ > /root/test.out'

刚才有人建议sudo tee:

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

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