问
我已经获得了我们开发用的 RedHat Linux 服务器之一的 sudo 访问权限,我似乎经常需要将输出重定向到我通常没有写入权限的位置。
麻烦在于,这个人为构造的例子不能正常工作:
sudo ls -hal /root/ > /root/test.out
我只收到响应 :
-bash: /root/test.out: Permission denied
我怎么才能让它工作?
答
你的命令之所以不工作,因为重定向是由你的 shell 执行的,而你的 shell 没有权限写入到 /root/test.out
。输出的重定向不是由 sudo
执行的。
你可以使用 sudo
命令结合 tee
命令将输出重定向到你没有写入权限的位置。tee
命令从标准输入读取并将其写入标准输出和文件。当与 sudo
一起使用时,它允许你将输出写入需要超级用户权限的位置。
以下是实现此操作的方法:
sudo command | sudo tee /path/to/output
在这个命令中:
- 在命令之前的
sudo
允许以超级用户权限执行命令。 |
(管道符)将前面命令的标准输出发送到后续命令的标准输入。- 第二个
sudo tee /path/to/output
允许将输出写入指定位置,即/path/to/output
,而你通常没有写入权限。
例如,如果要将命令 my_command
的输出写入需要超级用户权限的文件 /var/log/output.log
,你可以使用:
sudo my_command | sudo tee /var/log/output.log
运行此命令时,首先使用 sudo
处理 my_command
的输出以获取必要的权限,然后再次使用 sudo
和 tee
将输出写入 /var/log/output.log
。
请务必谨慎使用 sudo
,因为它授予了重要的权限,同时必须确保命令及其效果的准确性。
针对这一问题,还有如下几种解决方法:
- 使用
sudo
运行一个 Shell,并通过-c
选项传递命令:
sudo sh -c 'ls -hal /root/ > /root/test.out'
这样,命令及其重定向将在具有提升权限的 Shell 环境中执行。
- 创建一个包含命令的脚本,并使用
sudo
运行该脚本:
#!/bin/sh
ls -hal /root/ > /root/test.out
创建好脚本后,执行以下命令以提升权限运行:
sudo ./ls.sh
- 使用
sudo -s
启动一个具有提升权限的 Shell,然后在其中执行命令:
[nobody@so]$ sudo -s
[root@so]# ls -hal /root/ > /root/test.out
[root@so]# ^D # Ctrl+D,退出具有提升权限的 Shell
[nobody@so]$
在开启的具有超级用户权限的 Shell 中执行命令并完成重定向操作,完成后使用 Ctrl+D
退出。
- 使用
sudo
命令结合dd
命令
sudo ls -lha /root/ | sudo dd of=/root/test.out
- 使用 Here Documents
sudo bash <<EOF
ls -hal /root/ > /root/test.out
EOF
参考:
- stackoverflow question 82256
- man tee
- man dd
- https://www.gnu.org/software/bash/manual/bash.html#Here-Documents
相关阅读: