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

sudo ls -hal /root/ > /root/test.out  #此时他会报错
-bash: /root/test.out: Permission denied   #没有权限

为什么命令不起作用呢?

因为重定向是由您的 shell 执行的,它是没有写入权限的shell执行/root/test.out. sudo执行输出的重定向。

这里有多种解决方案

1.使用 sudo 运行 shell 并使用以下-c选项向它提供命令:

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

2.使用您的命令创建一个脚本并使用 sudo 运行该脚本:

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

运行sudo ls.sh

3.启动一个 shell,sudo -s然后运行你的命令:

[nobody@so]$ sudo -s
[root@so]# ls -hal /root/ > /root/test.out
[root@so]# ^D
[nobody@so]$

4.使用sudo tee(如果您在使用该-c选项时必须大量转义):

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

/dev/null需要重定向到以阻止tee输出到屏幕。要追加而不是覆盖输出文件 ( >>),请使用tee -aor tee --append

5.管道给sudo bash

echo 'echo 66 > /root/11.txt' | sudo bash

Q.E.D.