scp eine einzelne Datei an mehrere Speicherorte


28

Können Sie scpeine Datei an mehrere Speicherorte im selben Befehl senden?

Beispielsweise:

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

Oder wäre es praktischer, ein Bash-Skript zu erstellen, in dem alle Hosts bereits enthalten sind und für das lediglich eine Datei als Argument verwendet wird?

Antworten:


24

Angenommen, Sie haben eine Datei ( destfile.txt) mit user@host-Werten, eine in jeder Zeile. Dann könnte man das so machen:

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

Das funktioniert! Immer noch eine Handvoll zu tippen. Vielleicht gibt es einen Weg, dies zu vereinfachen.
Andrew

2
@Andrew, wenn Sie die for-loop in ändern while read dest; do, wird von der Standardeingabe gelesen. Setze es in ein Skript und füttere destfile.txtes damit (zB ./thescript.sh <destfile.txt).
Kusalananda

Ich mache das erstere, aber mit rsync und einige meiner Knoten werden nicht aktualisiert. Irgendeine Idee warum?
Soubriquet

7

Sieht aus wie ein Job für parallel-scp (n) (t) - implementiert eine Reihe von Befehlen, mit denen scp-Befehle auf mehreren Systemen gleichzeitig ausgeführt werden können. Es ermöglicht das Kopieren von Dateien parallel zu einer Reihe von Maschinen.


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

Eine andere Alternative (und ein Einzeiler) wäre, stattdessen pdsh zu verwenden, um eine Verbindung zu jedem Zielknoten herzustellen und einen Abruf von dort auszulösen:

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

Dies erfordert natürlich eine weitere Information (den lokalen Host) und unterschiedliche Benutzerrechte, aber Sie vermeiden, Bash einzulesen und die Datei durch Indirektion zu lesen.


0

Hier ist eine weitere Option mit einem einzeiligen Shell-Skript.

cscp.sh 20337.patch < hosts.txt

Es werden zwei Dateien verwendet, eine für die Schleife und eine für die Server-Host-Liste. Es liest $1nach dem ersten Parameter von der CLI als Dateiname zu SCP

cscp.sh

#!/bin/bash
while read host; do
  scp $1 ${host}:
done

hosts.txt

project-prod-web1
project-prod-web2
project-prod-web3

Verwendung

Datei auf mehrere Hosts kopieren:

cscp.sh file < hosts

0

Wenn Sie eine einheitliche Namenskonvention für mehrere Server verwenden, können Sie Folgendes tun:

for x in st1-abc-{11..20}.acme.com; do scp filez.tgz user@$x; done
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.