Відповіді:
Скажімо, у вас є файл ( destfile.txt
) із значеннями user@host
, по одному у кожному рядку. Тоді ви могли б зробити так:
while IFS= read -r dest; do
scp ourfile.txt "$dest:remote/path/"
done <destfile.txt
for
-loop while read dest; do
, він буде читатись зі стандартного вводу. Помістіть його в сценарій і введіть destfile.txt
у нього (наприклад, ./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") \
>( ... )
Іншою альтернативою (і однолінійним) буде замість цього використовувати pdsh для підключення до кожного цільового вузла та запускати дістатися звідти:
pdsh -w^destfile.txt scp hostname:/path/to/file /path/to/destfile
Звичайно, для цього потрібна ще одна інформація (локальний хост) та різні права користувача, але ви уникаєте циклу в bash та використання непрямості для читання файлу.
Ось ще один варіант із сценарієм з однорядковою оболонкою.
cscp.sh 20337.patch < hosts.txt
Він використовує два файли, один для циклу та один для списку хостів сервера. Він читає $1
перший параметр із CLI як ім'я файлу SCP
cscp.sh
#!/bin/bash
while read host; do
scp $1 ${host}:
done
hosts.txt
project-prod-web1
project-prod-web2
project-prod-web3
Використання
Скопіюйте файл на кілька хостів:
cscp.sh file < hosts