サーバーセットにディレクトリをコピーする方法

サーバーセットにディレクトリをコピーする方法

テキストファイル(hostfile)にリストされている他のサーバーにディレクトリをコピーする必要があります。

scpでこれを行う方法を見つけることができませんでした。

scp -r --hostfile ~/directory to_all@servers:~/

1つのサーバーに対してこれを行う方法はわかっていますが、scp -r directory one@server:~/複数のサーバーに対して行う方法はわかりません。サーバーの数は異なりますが、すべてのサーバーに同じユーザー名を使用します。

答え1

最も簡単な方法はシェルforループを使用することです。たとえば、

for s in server1 server2 server3 ... serverN ; do 
    scp -r directory/ $s:~/
done

小さな変更は、たとえば、ファイル内のサーバーをserver-list.txt1行に1つずつリストし、次のように行うことです。

for s in $(cat servers.txt) ; do 
    scp -r directory/ $s:~/
done

ファイルにコメントをサポートするための小さな変更もあります#(サーバーホスト名のコメントを含む)servers.txt

for s in $(sed -e 's/#.*//' servers.txt) ; do 
    scp -r directory/ $s:~/
done

サーバーのリストを取得または生成する他の方法は数多くあります。たとえば、データベースからリストを取得するために実行またはmysql照会psqlし、text/plainWebサーバーからファイルをインポートし、jsonWebサーバーからファイルをインポートして使用またはjq解析するpython -mjson.toolなどの方法があります。もっとあります。基本的なアプローチは同じままです。


他のファイル/ディレクトリに対してこれを頻繁に実行する必要がある場合、または複数のサーバーで同時にシェルコマンドを並列に実行する必要がある場合は、次のものをインストールすることをお勧めします。PDSHpdcp(並列分散コピー)およびpdsh(並列分散シェル)コマンドと共にパッケージ化され使用されます。pdshほとんどのディストリビューション用にパッケージ化されています。

ここで検索してくださいpdsh。これにはいくつかの質問と回答があります。

答え2

while read server; do scp -r ~/directory to_all@$server: ; done < hostfile

リモートユーザーが次のようになっているとします。本物call と入力しto_all、SSH キーを設定したとします(そうでない場合は、各サーバーのパスワードを要求します)。

関連情報