我在我们开发的RedHat Linux盒子上被授予sudo访问权限,而我似乎经常需要将输出重定向到通常没有写入权限的位置。
麻烦的是,这个人为的例子不起作用:
sudo ls -hal /root/ > /root/test.out
我刚刚收到响应:
-bash: /root/test.out: Permission denied
我该如何让这个工作?
我在我们开发的RedHat Linux盒子上被授予sudo访问权限,而我似乎经常需要将输出重定向到通常没有写入权限的位置。
麻烦的是,这个人为的例子不起作用:
sudo ls -hal /root/ > /root/test.out
我刚刚收到响应:
-bash: /root/test.out: Permission denied
我该如何让这个工作?
我会用这种方式:
sudo su -c 'ls -hal /root/ > /root/test.out'
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# sudo -s
# ls -hal /root/ > /root/test.out
# exit
这可能不是最好的方法,但它能够起作用。
这是基于涉及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
sudo at now
at> echo test > /tmp/test.out
at> <EOT>
job 1 at Thu Sep 21 10:49:00 2017
sudo
,那么at
就没有用处或必要性。sudo sh -c 'echo test >/tmp/test.out'
可以更高效、更优雅地完成相同的任务(但仍然存在一个缺陷,即您可能正在以不需要特权的root
身份运行某些命令;通常情况下,应尽可能避免使用特权命令)。 - tripleee也许你只被授予了对某些程序/路径的sudo访问权限?那么想要做你想做的事情是不可能的。(除非你以某种方式进行黑客攻击)
如果不是这种情况,那么也许你可以编写bash脚本:
cat > myscript.sh
#!/bin/sh
ls -hal /root/ > /root/test.out
按下 ctrl + d:
chmod a+x myscript.sh
sudo myscript.sh
sudo
权限的文件的权限。如果您拥有sudo
权限,请使用sudo bash
(或您喜欢的shell)在该shell中执行操作。 - Noel Yap