Odpowiedzi:
Załóżmy, że masz plik ( destfile.txt
) z user@host
opcjami -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
for
na while read dest; do
, odczytany zostanie ze standardowego wejścia. Umieść go w skrypcie i nakarm destfile.txt
go (np ./thescript.sh <destfile.txt
.).
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") \
>( ... )
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.
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 $1
pierwszy 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