パイプ(|
)とリダイレクト(<
、、、、)の両方<<
が標準ストリーム(>
>>
標準入力、標準出力、標準エラー)、パイプだけが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
リダイレクト(>
など<
)とパイプライン(|
など)は親プロセスによって初期化されます。今後すべてのコマンドが実行されます。
たとえば、親プロセスが何かを実行することを決定した場合は、2sudo ls /root | grep test
つのプロセスを作成し、標準I / Oストリームを適切に設定します(STDIN
、、、)。STDOUT
STDERR
チューニングされるプロセスについては、実行されるプロセスにリンクされsudo
ます。STDOUT
STDIN
grep
これが設定されると(親プロセスの を使用してUID:GID
)sudo
、grep
バイナリがそのプロセスにロードされ、実行されます。
プログラムは単に読み取り、書き込み、エラーをSTDIN
送るSTDOUT
ことができ、STDERR
「パイプ」は親プロセスに残ります。
これはUnix / Linuxの主な設計機能です。私は、一時ストアを介してすべてのプログラム間の接続を指定できるジョブ制御言語を使用してシステムをプログラムしました。ああ。