скапіруйте один файл у декілька місць


28

Чи можете ви scpподати файл у декілька місцеположень однієї команди?

Наприклад:

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

Або було б більш практичним створити bash-скрипт, у якому вже розміщені всі хости, і він би просто взяв файл як аргумент?

Відповіді:


24

Скажімо, у вас є файл ( destfile.txt) із значеннями user@host, по одному у кожному рядку. Тоді ви могли б зробити так:

while IFS= read -r dest; do
  scp ourfile.txt "$dest:remote/path/"
done <destfile.txt

Це працює! І все-таки жменька набрати, хоча. Можливо, є спосіб спростити це.
Андрій

2
@Andrew, якщо змінити for-loop while read dest; do, він буде читатись зі стандартного вводу. Помістіть його в сценарій і введіть destfile.txtу нього (наприклад, ./thescript.sh <destfile.txt).
Кусалаланда

Я роблю колишній, але з rsync і деякі мої вузли не оновлюються. Будь-яка ідея чому?
Субрікет

7

Схоже на роботу для паралельно-scp (n) (t) - це реалізує набір команд, які дозволяють виконувати команди scp в декількох системах одночасно. Це дозволить копіювати файли паралельно набору машин.


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

Іншою альтернативою (і однолінійним) буде замість цього використовувати pdsh для підключення до кожного цільового вузла та запускати дістатися звідти:

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

Звичайно, для цього потрібна ще одна інформація (локальний хост) та різні права користувача, але ви уникаєте циклу в bash та використання непрямості для читання файлу.


0

Ось ще один варіант із сценарієм з однорядковою оболонкою.

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

0

Якщо у вас є послідовна конвенція про іменування, яка діє на декількох серверах, ви можете зробити щось акуратне, як-от:

for x in st1-abc-{11..20}.acme.com; do scp filez.tgz user@$x; done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.