同様の質問があったことを知っていますが、正確な状況に対する回答が見つかりませんでした(重複していると思われる場合はいつでも閉じてください)。
会社のネットワークにあるため、ファイルを変更する権限がありません/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
上記の方法では、パスワードは履歴にプレーンテキストで表示されます。より良い方法は、起動時にのみ復号化された暗号化ボリュームに保存することです。より安全にするために、さまざまな調整と改善が可能です。