パイプはsudoを維持しますが、リダイレクトは維持しないのはなぜですか? [コピー]

パイプはsudoを維持しますが、リダイレクトは維持しないのはなぜですか? [コピー]

パイプ(|)とリダイレクト(<、、、、)の両方<<が標準ストリーム(>>>標準入力標準出力標準エラー)、パイプだけがsudo権限を維持できますが、なぜですか?

働く:

sudo echo "hello" | tee /root/test

動作しません:

sudo echo "hello" > /root/test

答え1

パイプ(|)とリダイレクト(<、<<、>、>>)の両方が標準ストリーム(stdin、stdout、stderr)を使用しますが、パイプだけがsudo権限を保持できるのはなぜですか?

これは本当ではありません。あなたは何かを混ぜたようです。

sudo echo "hello" | tee /root/test

これはechorootとして実行されていますが、teerootユーザーではなく現在のユーザーとして実行されています。

これが変化をもたらすでしょう

echo "hello" | sudo tee /root/test

ここでteeプログラムはrootとして実行されるため、/root/testファイルにアクセスできます。

答え2

リダイレクト(>など<)とパイプライン(|など)は親プロセスによって初期化されます。今後すべてのコマンドが実行されます。

たとえば、親プロセスが何かを実行することを決定した場合は、2sudo ls /root | grep testつのプロセスを作成し、標準I / Oストリームを適切に設定します(STDIN、、、)。STDOUTSTDERR

チューニングされるプロセスについては、実行されるプロセスにリンクされsudoます。STDOUTSTDINgrep

これが設定されると(親プロセスの を使用してUID:GIDsudogrepバイナリがそのプロセスにロードされ、実行されます。

プログラムは単に読み取り、書き込み、エラーをSTDIN送るSTDOUTことができ、STDERR「パイプ」は親プロセスに残ります。

これはUnix / Linuxの主な設計機能です。私は、一時ストアを介してすべてのプログラム間の接続を指定できるジョブ制御言語を使用してシステムをプログラムしました。ああ。

関連情報