sudo -Sがインタラクティブシェルをブロックする理由

sudo -Sがインタラクティブシェルをブロックする理由

sudoを使用して別のユーザーに切り替えようとしていますが、その-Sオプションを使用してstdinからパスワードを読むと、元のユーザーに戻ります。

例えば

コンテンツ~newuser/.profile:

echo "Welcome to newuser's account"

以下なしでsudoを使用する場合-S

$ whoami
origuser
$ sudo -iu newuser
[sudo] password for origuser:
Welcome to newuser's account
$ whoami
newuser

しかし、使用するとき-S

$ whoami
origuser
$ sudo -Siu newuser < password.txt
Welcome to newuser's account
$ whoami
origuser

したがって、見てわかるように、シェルは呼び出され-S解決されますが、.profileシェルは元のユーザーに返されます。

なぜこれですか?

この問題を解決できますか?

ベストアンサー1

の場合、sudo -Siu newuser < password.txtコマンドの標準入力sudo -Siu newuserはから取得されますpassword.txt。この-Sオプションを使用すると、sudo標準入力からパスワードを読み取ることができますpassword.txtただし、後続のシェルの標準入力は引き続きリダイレクトされます。

入力がシェルにリダイレクトされ(対話モードで実行されているかどうか)、入力の終わりに達するとシェルは終了します。これは、スクリプトを実行してファイルの終わりに到達するか、Ctrl+を押してD端末に入力の終わりを表示させるのと似ています。

したがって、内容の大部分が読み取られたファイルから入力がリダイレクトされるシェルを起動します。最後に到達して終了します。実際、あなたの目標は、シェルがこのファイルsudoではなく端末から入力を受け取り始めるようにすることです。

追加のファイル記述子とより間接的な方法やその他の方法を使用してこの問題を解決できますが、まず、別の手順で認証を行うことをお勧めします、シェルを実行する前に:

sudo -Sv < password.txt

完了したら、以下を実行できます。

sudo -iu newuser

最初のコマンドの直後に2番目のコマンドを実行すると、タイムスタンプはまだ有効であるため、パスワードをまったく入力する必要はありません。

sudowithを使用して指定されたユーザーでコマンドを実行すると、root(通常は使用されません)で-uコマンドを実行したときと同じように機能します。-u入力を求めるパスワードはあなたのパスワード、ターゲットユーザーのユーザーではないため、認証のみを実行するコマンド(使用-v)は他のユーザーに言及しません。これは可能ターゲットユーザーのパスワードを期待するように設定しますsudoが、実際にはそうする人はほとんどいません。

(もちろん、そのファイルからパスワードを読むことに関連するセキュリティリスクに関する一般的な警告は、以前と同じように適用されます。)

おすすめ記事