scp
を使用して、単一のファイルを複数のリモートサーバーに同時に送信できますか?もしそうなら、どうですか?そうでない場合、代替手段は何ですか?
pdsh パッケージのpdcp
は1つのオプションです。 pdsh
はHPCクラスターの管理を支援するために作成されました-私はそのためにそれを使用し、複数の非クラスターマシンの管理にも使用しました。
pdsh
およびpdcp
use genders ホストおよびホストのグループを定義します(「グループ」は、ホストに割り当てることを選択した任意のタグであり、ホストは必要な数のタグ。)
たとえば、hostA、hostB、hostCを含む/etc/genders
に「webservers」というグループがある場合、pdcp -g webservers myscript.sh /usr/local/bin
はmyscript.shを3つのホストすべての/ usr/local/bin /にコピーします。
同様に、pdsh -g all uname -r
は/ etc/gendersで「all」のタグが付けられたすべてのホストでuname -r
を実行し、各ホストからの出力の前にホストの名前を付けます。
$ pdsh -g all uname -r
indra: 3.2.0-3-AMD64
kali: 3.2.0-3-AMD64
ganesh: 3.2.0-3-AMD64
hanuman: 3.2.0-2-686-pae
pdshコマンドとpdcpコピーは並行して実行されます(元のシステムの過負荷を防ぐための制限とタイムアウトがあります)。
実行中のコマンドが複数行の出力を生成する場合、引用を混乱させる可能性があります。 pdsh
と呼ばれるdshbak
パッケージの別のプログラムは、読みやすくするためにホスト名で出力をグループ化できます。
すべてのコメントを見た後、pdshとpdcpはあなたのニーズに対してやり過ぎかもしれません...それは実際には通常の非rootユーザーのツールではなくシステム管理者のツールとして設計されています。
Scpの周りに単純なシェルスクリプトラッパーを書くことで十分かもしれません。例えばこれは、そのようなラッパースクリプトの非常にシンプルで最小限のバージョンです。
#! /bin/bash
# a better version would use a command line arg (e.g. -h) to get a
# comma-separated list of hostnames, but hard-coding it here illustrates
# the concept well enough.
HOSTS="[email protected] [email protected]"
# last argument is the target directory on the remote hosts
target_dir="$BASH_ARGV"
# all but the last arg are the files to copy
files=${@:1:$((${#@} - 1))}
for h in $HOSTS; do
scp $files "$h:$target_dir"
done
ファイルを複数のターゲットに同時に送信する代わりに、同時に複数回読み取ることができます。
ファイルをNFSに転送し、そのファイルシステムをターゲットにマウントして、NFSからローカルの宛先にコピーします。
これを手動で同時に行うには、ターゲットでcluster-ssh(cssh)を使用できます。