テキストファイル(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.txt
1行に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/plain
Webサーバーからファイルをインポートし、json
Webサーバーからファイルをインポートして使用または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 キーを設定したとします(そうでない場合は、各サーバーのパスワードを要求します)。