scp pojedynczy plik do wielu lokalizacji


28

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

Na przykład:

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

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

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

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.


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

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.


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.