bash スクリプトで SSH 接続を終了する方法

bash スクリプトで SSH 接続を終了する方法

私はこのトピックについてここでいくつかの投稿を読みましたが、私が見つけた解決策はすべて、1 つのコマンドを実行するワンライナーのようです。

複数の異なるホストに 1 つずつ ssh するスクリプトを作成しています。目標は、マシンに ssh し、いくつかのローカル コマンドを実行し、スクリプトを実行し、それが完了するまで待機してから ssh セッションを終了し、次のマシンに移動することです。

ただし、「exit」コマンドを使用すると機能せず、スクリプトが完全に終了してしまいます。

答え1

スクリプトは で直接呼び出しているため、シェル セッションを終了していないと思います./exit.shsource代わりに を使用する必要があります。

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接続と同じくらい安全であることは明らかです。

https://linux.die.net/man/1/pssh

答え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つのサーバーで実行したい場合はうまくいきます。並列で実行したい場合は他のオプションもありますが、初め。

関連情報