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が、実際にはそうする人はほとんどいません。

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

答え2

シェルが実行中で、シェルの標準入力が端末以外のデバイスに接続されている場合は、標準入力からコマンドを読み、標準入力が閉じるまで実行します。

走るとき

sudo -Siu newuser < password.txt

sudo読み取りの標準入力は、password.txtシェルsudoが始まるまで変更されないため、シェルも読みますpassword.txt。その後、2つのことが起こります。sudoパスワードが必要な場合は、パスワードを読み、シェルがすぐに到達します。ファイルの終わり(他に何もないと仮定)を終了し、そうでない場合、シェルはパスワードを解析して実行しようとします。

この問題を解決するための信頼できる方法があるかどうかはわかりません。とにかく二重処理は、(トークンを無効にしない限り)これをしたくないことを意味します。あなたできるの説明に従って、シェルを起動する前にトークンを準備します。エリア・ケイガンの回答、トークンを無効にしていない場合。

関連情報