単一のファイルを複数の場所にscp


28

scp同じコマンドで複数の場所にファイルを作成できますか?

例えば:

scp file.txt user@ip-1.com:, user@ip2.com:

または、すべてのホストがすでに含まれているbashスクリプトを作成して、引数としてファイルを取るだけの方が実用的ですか?

回答:


24

各行に1つの-values を持つファイル(destfile.txt)があるとしますuser@host。次に、このようにすることができます:

while IFS= read -r dest; do
  scp ourfile.txt "$dest:remote/path/"
done <destfile.txt

これは動作します!ただし、入力するのはまだ少しです。おそらくそれを単純化する方法があります。
アンドリュー

2
あなたが変更した場合@Andrew、forに-loopをwhile read dest; do、それが標準入力から読み込みます。それをスクリプトに入れて、フィードdestfile.txtします(例:)./thescript.sh <destfile.txt
クサラナンダ

私は前者をやっていますが、rsyncと私のノードのいくつかは更新されていません。理由は何ですか?
Soubriquet

7

parallel-scp (n)(t)のジョブのように見えます-これにより、scpコマンドを複数のシステムで一度に実行できる一連のコマンドが実装されます。一連のマシンに並行してファイルをコピーできます。


4
cat file.txt | tee >(ssh user@ip1.com "cat > file.txt") \
                   >(ssh user@ip2.com "cat > file.txt")

tar cz file1 file2 file3 | tee >(ssh user@ip1.com "tar xz") \
                               >( ... )

0

別の代替手段(およびワンライナー)は、代わりにpdshを使用して各ターゲットノードに接続し、そこからgetをトリガーすることです。

pdsh -w^destfile.txt scp hostname:/path/to/file /path/to/destfile

もちろん、これにはもう1つの情報(ローカルホスト)と異なるユーザー権限が必要ですが、bashでのループやインダイレクションを使用したファイルの読み取りは避けてください。


0

1行のシェルスクリプトを使用した別のオプションがあります。

cscp.sh 20337.patch < hosts.txt

ループ用とサーバーホストリスト用の2つのファイルを使用します。$1SCPのファイル名としてCLIから最初のパラメーターを読み取ります

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

0

複数のサーバーで一貫した命名規則を使用している場合、次のようなきちんとしたことができます。

for x in st1-abc-{11..20}.acme.com; do scp filez.tgz user@$x; done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.