scp одного файла в нескольких местах

28

Можете ли вы scpфайл в нескольких местах в одной команде?

Например:

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

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

Эндрю
источник

Ответы:

24

Допустим, у вас есть файл ( destfile.txt) с user@host-values, по одному в каждой строке. Тогда вы можете сделать так:

while IFS= read -r dest; do
  scp ourfile.txt "$dest:remote/path/"
done <destfile.txt
Kusalananda
источник
Это работает! Все еще горстка, чтобы напечатать хотя. Возможно, есть способ упростить это.
Андрей
2
@ Андрей, если вы измените for-loop на while read dest; do, он будет читать со стандартного ввода. Поместите это в сценарий и введите destfile.txtв него (например, ./thescript.sh <destfile.txt).
Кусалананда
Я делаю первый, но с rsync и некоторые из моих узлов не обновляются. Есть идеи почему?
Soubriquet
7

Выглядит как задание для Parallels-scp (n) (t) - здесь реализован набор команд, позволяющих запускать команды scp на нескольких системах одновременно. Это позволит копировать файлы параллельно с набором машин.

AnonymousLurker
источник
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") \
                               >( ... )
grawity
источник
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
deed02392
источник