scp eine einzelne Datei an mehrere Speicherorte

28

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

Beispielsweise:

scp file.txt [email protected]:, [email protected]:

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?

Andrew
quelle

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
Kusalananda
quelle
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.

AnonymousLurker
quelle
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.

Rick Moritz
quelle
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
David Thomas
quelle
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
deed02392
quelle