Pipe ( |
) 和重定向 ( <
, <<
, >
, >>
) 都使用标准流(stdin , stdout , stderr),但是虽然只有 pipeline 可以保留sudo
特权,为什么呢?
作品:
sudo echo "hello" | tee /root/test
不起作用:
sudo echo "hello" > /root/test
Pipe ( |
) 和重定向 ( <
, <<
, >
, >>
) 都使用标准流(stdin , stdout , stderr),但是虽然只有 pipeline 可以保留sudo
特权,为什么呢?
作品:
sudo echo "hello" | tee /root/test
不起作用:
sudo echo "hello" > /root/test
这根本不是真的。你一定把事情搞混了
这里
echo
是以root身份运行的,但是tee
是以你当前用户的身份运行的,这似乎不是root用户。这会有所不同
在这里,
tee
程序以 root 身份执行,因此可以访问 /root/test 文件重定向(
>
、<
等)和 piplines(等)在运行任何命令之前|
由父进程初始化。一旦父进程决定运行某些东西,例如
sudo ls /root | grep test
,它会创建两个进程,并适当地设置它们的标准 I/O 流(STDIN
、STDOUT
、STDERR
)。对于将要调谐的进程
sudo
,它STDOUT
连接到STDIN
将要运行的进程grep
。完成此设置(使用父进程的
UID:GID
)后,sudo
和grep
二进制文件将加载到其进程中并执行。程序可以简单地读取
STDIN
、写入STDOUT
并将错误发送到STDERR
,并将“管道”留给父进程。这是 Unix/Linux 的一个主要设计特点。我使用作业控制语言对系统进行了编程,这使我可以通过临时存储来指定所有程序间连接。啊。