私はこのトピックについてここでいくつかの投稿を読みましたが、私が見つけた解決策はすべて、1 つのコマンドを実行するワンライナーのようです。
複数の異なるホストに 1 つずつ ssh するスクリプトを作成しています。目標は、マシンに ssh し、いくつかのローカル コマンドを実行し、スクリプトを実行し、それが完了するまで待機してから ssh セッションを終了し、次のマシンに移動することです。
ただし、「exit」コマンドを使用すると機能せず、スクリプトが完全に終了してしまいます。
答え1
スクリプトは で直接呼び出しているため、シェル セッションを終了していないと思います./exit.sh
。source
代わりに を使用する必要があります。
exit
スクリプト内のステートメントによってシェル セッションが閉じられます。
$ source exit.sh
# or
$ . exit.sh
組み込み関数source
はスクリプトを現在のシェルコンテキスト、./exit.sh
起動しながら新しいシェルそれを実行します。
答え2
コマンドをファイルに入れてcatを使ってみたり、EOFを使ってみたりしましたか?
ssh -t [email protected] << EOF
command1
command2
exit
EOF
答え3
何を達成しようとしているのかを検討することをお勧めしますpssh
。これにより、マシン間での接続の開閉の微妙な違いを簡単に処理でき、並列実行して実行時間を短縮することもできます。
これは依然としてssh
トランスポート プロトコルとして使用されるため、ループssh
接続と同じくらい安全であることは明らかです。
答え4
通常は問題なくfor
ループを実行できます。ssh
$ for srv in 192.168.88.138; do echo $srv:; ssh $srv uptime; done
192.168.88.138:
13:27:25 up 30 days, 8:42, 1 user, load average: 4.15, 4.06, 4.06
この場合は、uptime
反対側で実行しました。uptime
実行したいものに置き換えることができます。そこに何を置くかは、終了する必要がある場所です。 uptime
出力を印刷すると終了しますが、スクリプトを記述している場合は、ループを続行できるように最終的に終了するようにする必要がありますfor
。
複雑な処理をする場合は、スクリプトを別のファイルに作成し、scp
それを実行したいサーバーに送り、SSH で接続して実行することをお勧めします。引用符やエスケープを使用して複雑な処理を ssh に取り込むのは、通常、価値がないほど困難です。
私はこれを何百回も試しましたが、一度に1つのサーバーで実行したい場合はうまくいきます。並列で実行したい場合は他のオプションもありますが、アンシブル初め。