管道 ( |
) 和重定向 ( <
, <<
, >
, >>
) 都使用标准流 (标准输入,标准输出,标准错误),但是虽然只有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 流(STDIN
、STDOUT
、STDERR
)。
对于将要调谐的进程sudo
,它STDOUT
连接到STDIN
将要运行的进程grep
。
完成此设置(使用父进程的UID:GID
)后,sudo
和grep
二进制文件将加载到其进程中并执行。
程序可以简单地读取STDIN
、写入STDOUT
并将错误发送到STDERR
,并将“管道”留给父进程。
这是 Unix/Linux 的一个主要设计特点。我使用作业控制语言对系统进行了编程,这使我可以通过临时存储来指定所有程序间连接。啊。