ループ内で複数のサーバーにログインする方法

ループ内で複数のサーバーにログインする方法

script.shというスクリプトがあります。私はそれをホスト1、ホスト2などの他のコンピュータで実行したいと思います。ユーザー名とパスワードを渡して各サーバーをどのように繰り返すことができますか?

答え1

キーなしで複数のサーバーを繰り返すには、プレーンテキストまたは単純に暗号化されたパスワードを含むファイルを繰り返す必要があります。特に本番環境では、この作業を直接行わないことをお勧めします。


警告 - 推奨しません

sshpassサーバーのホスト名とパスワードを含むテキストファイルを使用すると、迅速で複雑なソリューションを得ることができます。

serverList.txt 例:

server1 password1
server2 password2

本物安全でないスクリプトの例:

for host in $(awk '{print $1}' serverList.txt); do
    password=$(grep -w "$host" serverList.txt | awk '{print $2}')
    sshpass -p "$password" ssh $host < ./script.sh
done

これが私が提案するものです:

これが定期的に実行する必要がある場合はdsh(分散シェル)を見てください。

インストールする

Debian/Ubuntu からインストールするのは簡単です:

sudo apt-get install dsh

RHELベースのディストリビューションの場合は、libdshconfigまずコンパイルしてから次のことを行う必要がありますdsh

# libdshconfig
wget http://www.netfort.gr.jp/~dancer/software/downloads/libdshconfig-0.20.10.cvs.1.tar.gz
tar xfz libdshconfig*.tar.gz 
cd libdshconfig-*
./configure ; make
make install

# dsh
wget http://www.netfort.gr.jp/~dancer/software/downloads/dsh-0.22.0.tar.gz
tar xfz dsh-0.22.0.tar.gz
cd dsh-*
./configure ; make 
make install

構成

dshデフォルトでは、設定はrshログインプロトコルとして使用されます。これを暗号化されていないsshに変更することもできますrsh

経由でインストールした場合、設定aptファイルは次のようになります/etc/dsh/dsh.conf。 - RHELベースの展開用にコンパイルする必要がある場合、構成ファイルは次のようになります。/usr/local/etc/dsh.conf

これを更新してください:

remoteshell =rsh

これに関して:

remoteshell =ssh

これを完了したら、プログラムを実行するコンピュータのリストが必要です。 Debian の場合はファイルは で/etc/dsh/machines.list、RHEL の場合はファイルは次のようになります。/usr/local/etc/dsh/machines.list

リストは、改行で区切られたホスト名、IP、またはFQDNの形式にすることができます。たとえば、machines.listすべてのホスト名またはFQDNが解決された場合、以下は有効なファイルです。

10.20.30.40
10.20.30.31
server1.stackexchange.com
server2
root@myOtherServer

はい

これで、複数のホストでコマンドを順次実行または並列実行できます。machines.list

次に、出力のみが返されます。

dsh -a <command>

$ dsh -a echo hello
hello
hello

各ホスト名をその出力のプレフィックスとして印刷します。

dsh -a -M <command>

$ dsh -a -M echo hello
root@server1: hello
root@server2: hello

同じことを行いますが、順番に実行するのではなく、コマンドを同時に実行してください。

dsh -aMc <command>

選択したホストのみを使用:

dsh -Mc -m <host1> -m <host2> <command>

ガイドライン

したがって、あなたのシナリオで問題は、SSHキーを設定する必要があり(各ホストにパスワードを入力する必要がない場合)、各ホストにスクリプトが必要であることです。

個人的には、これはスクリプトのサイズに応じて実行するための最良かつ最も安全な方法だと思います。 SSHを介して各ホストにスクリプトを渡す必要がないため、すべてローカルでスクリプトを実行できます。

答え2

複数のコンピュータでスクリプトを実行するには、を使用することをお勧めします。parallelこのツールはあなたの要件に完全に適しています。

チュートリアルを見るここそしてここ

答え3

使い方は非常に簡単sshで、ほとんどのシステム管理者が常に使用しています。この例では、3つのリモートホストと1つのアクティブホストがあるとします。アクティブ項目はhost1、残りは、およびと呼ばhost2host3ますhost4。そして、ユーザー名はすべてのホストで同じですuser1

SSH鍵ペアの生成(シェルに戻るまでEnterキーを押すだけです):

user1@host1$ ssh-keygen -t rsa

公開鍵の配布host2、およびhost3host4

user1@host1$ for i in {2..4}; do ssh-copy-id user1@host$i;done
user1@host2 password:
user1@host3 password:
user1@host4 password:

スクリプトを通過からhost1

user1@host1$ for i in {2..4}; do scp script.sh user1@host$i:/home/user1 ;done

スクリプトの実行からhost1

user1@host1$ for i in {2..4}; do ssh user1@host$i 'sh script.sh'; done

関連情報