私は(この質問の目的にsu
興味がない)次の動作を観察しています。sudo
$ su USER -s /bin/bash -c "echo hi"
hi
$ printf "" | su USER -s /bin/bash -c "echo hi"
Password: su: Authentication failure
$ su USER -s /bin/bash -c "echo hi" < /dev/null
Password: su: Authentication failure
$ su USER -s /bin/bash -c "echo hi" < /dev/tty
Password:
$ su USER -s /bin/bash -c "echo hi" < /dev/tty1
hi
標準入力をリダイレクトすると、パスワードプロンプトが表示される理由を生涯理解できません。私はsu
stdinがリダイレクトされたコンテキストでそれを使用しているので、これを避けることはできません。
その理由は何ですか、su
stdinがリダイレクトされたときにプロンプトを回避する方法は?
ベストアンサー1
明確にするために、OPはUSERアカウントにパスワードが設定されていないと述べました。
~からman pam_unix
(pam_unix下記のモジュールです):
だれ
このモジュールの基本的な作業は、公式のパスワードが空の場合、ユーザーがサービスにアクセスすることを許可しないことです。 nullokパラメーターはこのデフォルト値を無視し、空のパスワードを持つすべてのユーザーがサービスにアクセスできるようにします。
nullok_secure
このモジュールの基本的な作業は、公式のパスワードが空の場合、ユーザーがサービスにアクセスすることを許可しないことです。 nullok_secureパラメーターは、このデフォルト設定を無視して、PAM_TTY値が/ etc / securettyの値の1つに設定されている限り、nullパスワードを持つすべてのユーザーがサービスにアクセスできるようにします。
あなたnullok_secure
のPAM設定が。
動作させるには、nullok_secure
次のように置き換えます。nullok
Debian では、/etc/pam.d/common-auth
他の Unix や Linux ディストリビューションによって異なる場所(特定のファイルなどsu
)に置くことができます。
追加の注:コマンドを使用するときにパスワードなしで成功するには、次のnullok_secure
場所にあるTTYで実行する必要があります。/etc/securetty
または欠落している/etc/securetty
(これにより、「PAM_TTYが/ etc / securettyの値の1つに設定されている」は常にtrueになります)。 TTYがなければ、これは重要ではなく、常に失敗します。