私が行った場合:
Sudo cat /etc/resolv.conf | less
Stdinを(おそらく)使用しない場合でも、パスワードの入力を求められます。パスワードプロンプトはどのfdで表示され、どのようにして入力を取り戻すのですか?
実際、Sudo
の典型的な呼び出しは、stdin
からパスワードをまったく読み取りません。代わりに、Sudo
は制御端末に直接アクセスし(tty
またはpty
、/dev/tty
特殊ファイルを介して)、プロンプトを出力し、文字を直接読み取ります。これは、Sudo
ソースのtgetpass.c
ファイルで確認できます。
他にもいくつかのシナリオがあります。
askpass
プログラムが指定されている場合。 -A
パラメータで、そのプログラムが呼び出されます。Sudo
からstdin
への読み取りを明示的に要求すると、たとえば、 -S
フラグを使用して-プロンプトをstderr
に書き込みます。これは MadHatterの回答 が適用される場合です。tty
がない場合visiblepw
のsudoers
フラグによって制御されます)、Sudo
はエラーを報告します:no tty present and no askpass program specified
Sudo
は、特に要求されていなくても、stdin
およびstderr
の使用にフォールバックします。 MadHatterの回答 もここに適用されます。パイプはSudo cat
のless
のstdinへの標準出力なので、Sudo cat
のstdinは影響を受けず、パスワードを受け取ることができます。
プロンプトに関しては、それはSudo cat
のstderr; bashでは、それをstdoutと一緒にリダイレクトしてみてください
Sudo cat /etc/resolv.conf |& less
レスポンスがどの程度異なるかを確認してください。