scp pojedynczy plik do wielu lokalizacji

28

Czy możesz scpplik do wielu lokalizacji w tym samym poleceniu?

Na przykład:

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

Czy może bardziej praktyczne byłoby stworzenie skryptu bash, w którym są już wszystkie hosty, a argumentem byłby tylko plik?

Andrzej
źródło

Odpowiedzi:

24

Załóżmy, że masz plik ( destfile.txt) z user@hostopcjami -values, po jednym w każdym wierszu. Następnie możesz zrobić tak:

while IFS= read -r dest; do
  scp ourfile.txt "$dest:remote/path/"
done <destfile.txt
Kusalananda
źródło
To działa! Wciąż garstka do napisania. Być może istnieje sposób, aby to uprościć.
Andrew
2
@Andrew, jeśli zmienisz opcję -loop forna while read dest; do, odczytany zostanie ze standardowego wejścia. Umieść go w skrypcie i nakarm destfile.txtgo (np ./thescript.sh <destfile.txt.).
Kusalananda
Robię to pierwsze, ale z rsync i niektóre moje węzły nie aktualizują się. Masz pomysł, dlaczego?
Soubriquet
7

Wygląda jak zadanie dla równoległego scp (n) (t) - to implementuje zestaw poleceń, które pozwalają na uruchamianie poleceń scp na wielu systemach jednocześnie. Pozwoli to na kopiowanie plików równolegle do zestawu maszyn.

Anonimowy Czyhacz
źródło
0

Inną alternatywą (i linią pojedynczą) byłoby użycie pdsh do połączenia z każdym węzłem docelowym i wywołania stamtąd:

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

Wymaga to oczywiście jeszcze jednej informacji (hosta lokalnego) i różnych praw użytkownika, ale unika się zapętlania basha i używania pośredniego odczytu pliku.

Rick Moritz
źródło
0

Oto kolejna opcja, z jednym wierszem skryptu powłoki.

cscp.sh 20337.patch < hosts.txt

Używa dwóch plików, jednego dla pętli i jednego dla listy hostów serwera. Odczytuje $1pierwszy parametr z CLI jako nazwę pliku do SCP

cscp.sh

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

hosts.txt

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

Stosowanie

Skopiuj plik do wielu hostów:

cscp.sh file < hosts
David Thomas
źródło
0

Jeśli masz spójną konwencję nazewnictwa dla wielu serwerów, możesz zrobić coś porządnego:

for x in st1-abc-{11..20}.acme.com; do scp filez.tgz user@$x; done
deed02392
źródło