同じコマンドでファイルを複数の場所にscp
できますか?
例えば:
scp file.txt [email protected]:, [email protected]:
または、すべてのホストが既に含まれているbashスクリプトを作成し、ファイルを引数として使用する方が現実的でしょうか。
ファイルがあるとしましょう(destfile.txt
)user@Host
- values、各行に1つ。次に、このようにすることができます:
while IFS= read -r dest; do
scp ourfile.txt "$dest:remote/path/"
done <destfile.txt
cat file.txt | tee >(ssh [email protected] "cat > file.txt") \
>(ssh [email protected] "cat > file.txt")
tar cz file1 file2 file3 | tee >(ssh [email protected] "tar xz") \
>( ... )
1行のシェルスクリプトを使用する別のオプションを次に示します。
cscp.sh 20337.patch < hosts.txt
ループ用とサーバーのホストリスト用の2つのファイルを使用します。 $1
CLIからの最初のパラメータをSCPへのファイル名として
cscp.sh
#!/bin/bash
while read Host; do
scp $1 ${Host}:
done
hosts.txt
project-prod-web1
project-prod-web2
project-prod-web3
使用方法
ファイルを複数のホストにコピーします。
cscp.sh file < hosts
複数のサーバーで一貫した命名規則を使用している場合は、次のようなきちんとしたことができます。
for x in st1-abc-{11..20}.acme.com; do scp filez.tgz user@$x; done
Xargsを使用することもできます。
hosts.txt:
[email protected]:
[email protected]:
次に、次のコマンドを実行します。
cat hosts.txt | xargs -I Host scp file.txt Host
別の代替手段(およびワンライナー)は、代わりにpdshを使用して各ターゲットノードに接続し、そこからのgetをトリガーすることです。
pdsh -w^destfile.txt scp hostname:/path/to/file /path/to/destfile
もちろん、これにはもう1つの情報(ローカルホスト)とさまざまなユーザー権限が必要ですが、bashでループしたり、間接参照を使用してファイルを読み取ることは避けます。