Назад | Перейти на главную страницу

Используйте scp для копирования файла на разные серверы

Мне почти каждый день приходится копировать файл на разные серверы. Что я обычно делаю:

scp filename user@destinationhost:/destination/folder

Я запускаю ту же самую команду, меняя целевой хост снова и снова, пока не завершу работу всех серверов. Каков наилучший (и самый быстрый) способ передать один и тот же файл на эти разные серверы?

Другой недостаток заключается в том, что мне нужно вводить пароль снова и снова, но использование rsa не вариант, поскольку несколько человек могут подключиться к исходному серверу.

Изменить - я нашел петлю в командная строка это может помочь:

 for h in host1 host2 host3 host4 ; { scp file user@$h:/destination_path/ ; }

Существуют различные инструменты, которые могут передавать файлы scp на несколько хостов (с одновременными подключениями), например пшш и Каниф. Что касается паролей, я бы предложил использовать экспедирование агента. Это позволяет вам хранить ключ на вашем локальном компьютере, но использовать его при инициации SSH-соединений с другого хоста. В противном случае --askpass вариант для parallel-scp команда от пшш заставляет запрашивать пароль для каждого хоста.

Если вы не можете установить инструмент для этого, настройте пересылку агента (добавив -A возможность ssh при подключении к машине, на которой вы это делаете), а затем запустите scp в таком цикле:

for HOST in server1 server2 server3; do
    scp somefile $HOST:~/somedir/
done

Попробуйте сделать это с помощью сценария ожидания, например.

#!/bin/bash

HOSTS="h1.lan h2.lan h3.lan"

read -p "Password: " PASSWORD


for HOST in $HOSTS
do
    expect -c "
    spawn /usr/bin/scp file user@$HOST:/destination_path/
    expect {
    "*password:*" { send $PASSWORD\r;interact }
    }
    exit
    "
done

Вышеупомянутое должно быть довольно простым, чтобы адаптироваться к вашим требованиям.

думаю sshpass здесь следует упомянуть. Я продолжаю отправлять файл нескольким целям с требуемым паролем:

filePath="/home/download/textToSend.txt"
ip_range=("10.10.10.1" "10.10.10.2" "10.10.10.3" "10.10.10.4")
# Start file transfer
echo "Starting file transfer to ${#ip_range[@]} units."
for ((i=0; i<${#ip_range[@]}; ++i )) ;
do
   echo "Transfering ${filePath} to ${ip_range[$i]}..."
   sshpass -p password scp -o 'StrictHostKeyChecking=no' "${filePath}" root@${ip_range[$i]}:/home/downloads&
done
wait
echo "File transfers ended"

Я использовал sshpt в подобной ситуации. SSH Power Tool (sshpt) позволяет выполнять команды и загружать файлы на множество серверов одновременно через SSH без использования общих ключей. Загруженные файлы и команды могут выполняться напрямую или через sudo.