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

1113

我在我们开发的RedHat Linux盒子上被授予sudo访问权限,而我似乎经常需要将输出重定向到通常没有写入权限的位置。

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

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

我刚刚收到响应:

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

我该如何让这个工作?


1
使用 chmod u+w filename。 - Szabolcs Dombi
@DombiSzabolcs 你建议我先以sudo身份创建文件,然后再给自己权限?好主意。 - Jonathan
2
在很多情况下,您会因为问了“为什么我会收到权限被拒绝的错误信息?”而来到这里。有时答案是确实需要以“root”身份创建文件(在这种情况下,请继续阅读答案),但很多时候,您只需要在其他位置以自己的身份创建文件即可。 - tripleee
3
在经过一番探索后,我最终选择将结果重定向到一个临时文件,然后使用sudo命令将其移动到目标位置。 - TingQian LI
请参见 https://dev59.com/UXVD5IYBdhLWcg3wHnsX?rq=1 - Nate Eldredge
不!出于安全原因,通常不建议打开需要sudo权限的文件的权限。如果您拥有sudo权限,请使用sudo bash(或您喜欢的shell)在该shell中执行操作。 - Noel Yap
15个回答

5
我会这样做:

我会用这种方式:

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

3
这实际上看起来更加简洁,因为你不需要显式地指定 shell。 - Steve Bennett
1
一个小缺点是它会运行一个额外的进程(su):$ sudo su -c 'pstree -sp $$ >/dev/fd/1'init(1)───gnome-terminal(6880)───bash(6945)───sudo(401)───su(402)───bash(410)───pstree(411) - pabouk - Ukraine stay strong

5
每当我需要做这样的事情时,我就变成root用户:
# sudo -s
# ls -hal /root/ > /root/test.out
# exit

这可能不是最好的方法,但它能够起作用。


3

这是基于涉及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

如代码中所示使用方法,您只需将输出传输到此脚本,后跟所需的超级用户可访问的文件名,如果需要(因为它包括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/ 设备,这是在本页面上的评论中提到的一个问题。

2
sudo at now  
at> echo test > /tmp/test.out  
at> <EOT>  
job 1 at Thu Sep 21 10:49:00 2017  

1
如果您已经有了sudo,那么at就没有用处或必要性。sudo sh -c 'echo test >/tmp/test.out'可以更高效、更优雅地完成相同的任务(但仍然存在一个缺陷,即您可能正在以不需要特权的root身份运行某些命令;通常情况下,应尽可能避免使用特权命令)。 - tripleee

1

也许你只被授予了对某些程序/路径的sudo访问权限?那么想要做你想做的事情是不可能的。(除非你以某种方式进行黑客攻击)

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

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

按下 ctrl + d

chmod a+x myscript.sh
sudo myscript.sh

希望它有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接