複数のリモートサーバーでサービスを安全に再起動する

複数のリモートサーバーでサービスを安全に再起動する

同僚と私が複数のサーバーで異なるサービスを再起動できるようにスクリプトを作成する必要があります。私たちはすべてLDAPを使用してサーバーに接続しているので、スクリプトでLDAPユーザーをサーバーに接続し、sudoを使用してサービスを再起動したいと考えています(必要なすべてのサービスを再起動するスクリプトを各サーバーに作成できます)。現在、スクリプトは次のようなコマンドを実行するだけです。

ssh -t user@host "sudo service XXX restart" 

問題は、スクリプトが各サーバーに対してユーザー パスワードを 2 回要求することです (1 回は ssh 接続用、2 回は sudo コマンド用)。私の最初の推測は、read -s -p を使用してユーザーにログインとパスワードを要求し、変数を使用して ssh で自動的にログインすることでした。どうやら、Expect はこれを実行する方法のようですが、Expect スクリプトで安全にパスワードを要求する方法や、bash スクリプトで要求して expect スクリプトで安全に変数を渡す方法は見つかりませんでした。

pssh、cluster ssh などのソリューションを調べましたが、これらは機能しているようですが、sudo では機能しません。これを行う最善の方法は ssh キーを使用することだと理解していますが、複数のユーザーがスクリプトを使用する必要があるため、LDAP ログイン/パスワードを使用したいと思います。

答え1

Glenn がコメントで示唆したように、これを行う正しい方法は stty を使用することです。

# grab the password
stty -echo
send_user -- "Password for $user@$host: "
expect_user -re "(.*)\n"
send_user "\n"
stty echo
set pass $expect_out(1,string)

#... later
send -- "$pass\r"

関連情報