複数のサーバーで同じコマンドを実行する方法

複数のサーバーで同じコマンドを実行する方法

クラスタとして機能する4つのSuseサーバーがあります。名前 CS-1 CS-2 CS-3 CS-4

CS-1では、CS-2 CS-3 CS-4に直接SSH経由で接続できます(ssh CS-2、ssh CS-3、SSH CS-4)。 CS-2では、CS-1 CS-に直接SSH経由で接続できます。 3 CS-4(ssh CS-1、SSH CS-3、SSH CS-4)

これら4つのサーバーすべてで3つのコマンドを実行する必要があります。

sed 's/aes128-ctr/aes129-ctr/' </etc/ssh/sshd_config> sshd_config.new; mv sshd_config.new sshd_config
sed 's/aes130-ctr/aes131-ctr/' </etc/ssh/sshd_config> sshd_config.new; mv sshd_config.new sshd_config
sed 's/aes132-ctr/aes133-ctr/' </etc/ssh/sshd_config> sshd_config.new; mv sshd_config.new sshd_config

シェルスクリプトでこれを行うにはどうすればよいですか?

答え1

これを行う方法はいくつかあります。

これが定期的に実行できる作業である場合は、次のことを検討してください。アンシプールまたは他の同様の自動化ツール。

これが1回限りの場合、おそらく最も簡単な方法は、これらのコマンドをスクリプトにコピーし、スクリプトをscpリモートシステムにコピーしてから、次のようにリモートで実行することですssh

$ for host in cs-{2..4}; do scp my-script.sh myuser@"$host":; ssh -t $host "sudo ./my-script.sh"; done

ただし、コマンドに自分がいる場合は、sed手動で一時ファイルを作成して新しいファイルをコピーする代わりに、次のことを実行できます。

sed --in-place 's/aes128-ctr/aes129-ctr/;s/aes130-ctr/aes131-ctr/;s/aes132-ctr/aes133-ctr/' /etc/ssh/sshd_config

これはコマンドなので、各ホストに対して簡単に次のことができます。

$ ssh user@host "sed --in-place 's/aes128-ctr/aes129-ctr/;s/aes130-ctr/aes131-ctr/;s/aes132-ctr/aes133-ctr/' /etc/ssh/sshd_config"

答え2

一部のサーバーで同じコマンドを実行する必要がある場合よくpssh、同じツールと関連ツールを見ることをお勧めします。パック

〜50のリモートホストを制御する必要があるラップトップで行った操作(ssh設定はすでにキー認証を使用しています):

  1. ホスト名のリストを作成します。たとえば、~/.dev-hosts.listこのリストにはホスト名のみがあります。
dev-host1
dev-host2
...
  1. dateリストの各ホストで次のコマンドを実行します。

pssh -h ~/.dev-hosts.list -l developer -i date

  1. 任意に選択できる:便宜上、すべてをエイリアスで囲みますalias run.on.dev='pssh -h ~/.dev-hosts.list -l username'。後でdateこれらのマシンで実行して出力を取得するには、いくつかのキーストロークが必要です。

run.on.dev -i date

明らかに、この方法であなたのケースを含むほぼすべてのコマンドを実行できますsed

これにより、-lSSHを介してこれらのホストに接続するためのユーザー名を指定でき、-iコマンドで生成された出力を表示できます。

関連情報