インタラクティブシェルでsudo、パスワードは不要

インタラクティブシェルでsudo、パスワードは不要

同様の質問があったことを知っていますが、正確な状況に対する回答が見つかりませんでした(重複していると思われる場合はいつでも閉じてください)。

会社のネットワークにあるため、ファイルを変更する権限がありません/etc/sudoers

これを使用してsudo -u svc_produser -iユーザーを対話型シェルに切り替えます。毎回パスワードの入力を求められます。パスワードを自動的に渡し、可能であればサービスユーザーとしてログインしたらすぐにコマンドを実行する方法を望みます。

-iパスワードが機能していないため、パイプできません-S--stdin)。

以前の会社ではスクリプトを使用してこれを達成しましたが、expect使用可能なスクリプトはありませんでした。

私はPythonを使うことができますが、これを行うための簡単なBash方法があることを望みました。

答え1

はい、Askpassオプションを使用してこれを実行できます。からman sudo

-A, --askpass

通常、sudoにパスワードが必要な場合は、ユーザー端末からパスワードを読みます。 -A(askpass)オプションを指定すると(可能なグラフィックス)ヘルパープログラムが実行され、ユーザーのパスワードを読み取り、パスワードを標準出力に出力します。 SUDO_ASKPASS 環境変数が設定されている場合、ヘルパープログラムのパスを指定します。

したがって、最も簡単な形式でパスワードを出力するスクリプトを作成できます。

$ cat ~/scripts/foo.sh
#!/bin/sh
printf '%s\n' this_is_my_password

次に、SUDO_ASKPASS変数がそれを指すように設定します。

export SUDO_ASKPASS=/home/terdon/scripts/foo.sh

だからあなたは走る

sudo -A -u svc_produser -i 

対話型シェルの場合、コマンドのみを実行したい場合は、次のことができます。

sudo -A -u svc_produser command

たとえば、私のシステムでは次のようになります。

$ sudo -A whoami
root

今これは明らかに非常に安全ではないようです。自分で読むことができるファイルを作成し、その中にパスワードを保存すると、より良い結果が得られます。

$ printf 'this_is_my_password\n' > ~/.hidden_file
$ chmod 600 ~/.hidden_file

より良い方法は、使用しないでprintfエディタウィンドウを開き、パスワードを書くことです。printf上記の方法では、パスワードは履歴にプレーンテキストで表示されます。より良い方法は、起動時にのみ復号化された暗号化ボリュームに保存することです。より安全にするために、さまざまな調整と改善が可能です。

関連情報