为什么管道保留 sudo 而重定向不保留?

为什么管道保留 sudo 而重定向不保留?

管道 ( |) 和重定向 ( <, <<, >, >>) 都使用标准流 (标准输入,标准输出,标准错误),但是虽然只有pipe可以保留sudo权限,为什么呢?

作品:

sudo echo "hello" | tee /root/test

不起作用:

sudo echo "hello" > /root/test

答案1

管道 (|) 和重定向(<、<<、>、>>)都使用标准流(stdin、stdout、stderr),但尽管只有管道可以保留 sudo 权限,为什么?

这根本不是真的。你一定把事情搞混了

sudo echo "hello" | tee /root/test

这里echo是以root身份运行的,但是tee是以你当前用户的身份运行的,这似乎不是root用户。

这会有所不同

echo "hello" | sudo tee /root/test

在这里,tee程序以 root 身份执行,因此可以访问 /root/test 文件

答案2

重定向(><等)和 piplines(|等)由父进程初始化您的任何命令都会运行。

一旦父进程决定运行某些东西,例如sudo ls /root | grep test,它会创建两个进程,并适当地设置它们的标准 I/O 流(STDINSTDOUTSTDERR)。

对于将要调谐的进程sudo,它STDOUT连接到STDIN将要运行的进程grep

完成此设置(使用父进程的UID:GID)后,sudogrep二进制文件将加载到其进程中并执行。

程序可以简单地读取STDIN、写入STDOUT并将错误发送到STDERR,并将“管道”留给父进程。

这是 Unix/Linux 的一个主要设计特点。我使用作业控制语言对系统进行了编程,这使我可以通过临时存储来指定所有程序间连接。啊。

相关内容