web-dev-qa-db-ja.com

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

私が行った場合:

Sudo cat /etc/resolv.conf | less

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

25
Karlo

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

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

  • askpassプログラムが指定されている場合。 -Aパラメータで、そのプログラムが呼び出されます。
  • それ以外の場合、Sudoからstdinへの読み取りを明示的に要求すると、たとえば、 -Sフラグを使用して-プロンプトをstderrに書き込みます。これは MadHatterの回答 が適用される場合です。
  • そうでない場合、ttyがない場合
    • パスワードエコーが無効になっている場合(デフォルトでは、visiblepwsudoersフラグによって制御されます)、Sudoはエラーを報告します:no tty present and no askpass program specified
    • それ以外の場合、Sudoは、特に要求されていなくても、stdinおよびstderrの使用にフォールバックします。 MadHatterの回答 もここに適用されます。
48
Bob

パイプはSudo catlessのstdinへの標準出力なので、Sudo catのstdinは影響を受けず、パスワードを受け取ることができます。

プロンプトに関しては、それはSudo catのstderr; bashでは、それをstdoutと一緒にリダイレクトしてみてください

Sudo cat /etc/resolv.conf |& less

レスポンスがどの程度異なるかを確認してください。

10
MadHatter