パイプされたsudoコマンドでパスワード入力が機能するのはなぜですか?


25

私が行った場合:

sudo cat /etc/resolv.conf | less

stdinを(おそらく)少なくしても、パスワードの入力を求められます。パスワードプロンプトはどのfdの上に表示され、どのように入力を取り戻しますか?

回答:


48

実際、の典型的な呼び出しはsudo、パスワードをまったく読み取りませんstdin。代わりに、sudo制御端末に直接アクセスし(特殊ファイルを介してttyまたは)、プロンプトを出力し、文字を直接読み取ります。これは、ソース内のファイルで確認できます。pty/dev/ttytgetpass.csudo

他にもいくつかのシナリオがあります。

  • askpassたとえば、-Aparamでプログラムが指定されている場合、そのプログラムが呼び出されます。
  • それ以外の場合、たとえばフラグを使用して、特にsudo読み取りを要求すると、プロンプトがに書き込まれます。これは、MadHatterの答えが当てはまる場合です。stdin-Sstderr
  • そうでなければ、tty利用可能なものがない場合
    • パスワードエコーが無効になっている場合(デフォルトでは、のvisiblepwフラグによって制御されますsudoers)、sudoエラーを報告します。no tty present and no askpass program specified
    • そうでない場合は、sudo使用にフォールバックされますstdinstderr、それを具体的に要求されなかった場合でも。MadHatterの回答もここに適用されます。

10

パイプはsudo catのstdout lessをのstdinに接続するため、sudo catのstdinは影響を受けず、パスワードを受け取ることができます。

プロンプトについては、sudo catのstderrに表示されます。bashでは、stdoutと一緒にリダイレクトしてみてください

sudo cat /etc/resolv.conf |& less

応答の違いを確認してください。


16
この答えはsudo、例のコマンドでまだstdinが端末に接続されているという点で正しいですが、パスワードの取得方法とは直接関係ありません:デフォルトでsudoは、stdinを介してパスワードを要求したり、プロンプトを表示したりしませstderr2>/dev/nullそれを確認しようとすることができます。代わりに、sudotty に直接アクセスします。
ボブ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.