バッシュ:SSH 経由での並列コマンド実行 [クローズド]
-
21-12-2019 - |
質問
私の問題は次のとおりです:特定のスクリプトを異なるサーバーで並行して実行することを目的としたスクリプトを作成しています。つまり、リモート サーバーにログインし、パスワードを入力し (ボスなので交渉の余地はありません)、スクリプトを開始し、スクリプトの実行中に接続を閉じ、次のサーバーに接続して、ダンス全体をもう一度実行したいと考えています。どうすればいいのですか?
解決
bash がすべてのリモート マシンのターゲット シェルであると仮定すると、1 台のマシンに対して次のようにすることができます。
ssh user@host /path/to/script '&>/dev/null' '</dev/null' '&' disown
複数のマシンの場合は、次のようにスクリプトを作成できます。
hosts='user1@host1 user2@host2'
for host in $hosts
do
ssh $host /path/to/script '&>/dev/null' '</dev/null' '&' disown
done
これにより、パスワードを入力するだけになります。
あるいは、複数のマシンに同じパスワードを使用できる場合は、次のことを検討することをお勧めします。 クラスターSSH. 。これを使用すると、複数のマシンに同時にログインし、それらすべてに送信するコマンドを 1 つのウィンドウに入力したり、各 xterm ウィンドウに個別に入力したりできます。これにより、同じパスワードを繰り返し入力する手間が省けます。ログインしたら、上記のようにコマンドを実行できます( ssh user@host
部分)して終了します。
アップデート
ここでいくつかの追加の考えを述べます。まず、何か問題が発生した場合に何が起こったのか分からないため、スクリプト出力を完全に破棄することはおそらく得策ではありません。置き換えることで、後で参照できるようにファイルに保存することもできます '&>/dev/null'
と '&>filename'
. 。もう 1 つの方法は、リモート マシンから電子メールで送信することです (これを行うように適切に設定されている場合)。
host=user@host
ssh $host \(/path/to/script '2>&1' \| mail -s "$host output" me@me.com\) \
'&>/dev/null' '</dev/null' '&' disown
次に、スクリプトがローカル ホスト上にある場合は、それをコピーして 1 つのコマンドで実行できます。置き換えるだけではない場合は、シェル スクリプトを想定します。 sh
正しい通訳を使用して)
</path/to/script ssh user@host \
cat \>script \; sh ./script '&>/dev/null' '</dev/null' '&' disown
他のヒント
ログイン後、screen ユーティリティを使用して新しいターミナル セッションを開始し、後でセッションから切断できます。例:
[user@local]$ ssh machine
[user@machine]$ screen -S my_session
# you are now switched to new terminal session named "my_session"
# now you can start long operation, that you want to keep in background
[user@machine]$ yes
# press "Ctrl-a d" to detach, you will go back to original session
[detached from 11271.my_session]
# now you can leave ssh (your session with "yes" running will be kept in background)
# to list existing screen sessions run:
[user@machine]$ screen -list
There is a screen on:
11271.my_session (Detached)
1 Socket in /var/run/screen/S-user.
# to re-attach use -r
[user@machine]$ screen -r my_session
# you will be back to session with "yes" still running (press Ctrl-C to stop it)
画面がどのように機能するかを理解したら、スクリプトを作成してみることができます。これは、my_command を実行して分離状態で screen セッションを開始する方法です。
$ screen -d -m my_command
expect
これは非常に簡単に自動化できます。
#!/usr/bin/expect -f
set hosts {your list of hosts goes here ...}
foreach host $hosts {
spawn ssh -t user@$host screen ./script.sh
expect "assword:"
send -- "secret\r"
sleep 1
send -- "d"
expect eof
}