24

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

Например:

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

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

5 ответов5

21

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

for dest in $(<destfile.txt); do
  scp ourfile.txt "$dest:remote/path/"
done

или же

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

Выглядит как задание для Parallels-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

Вот еще один вариант, с однострочным сценарием оболочки.

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .