Мне почти каждый день приходится копировать файл на разные серверы. Что я обычно делаю:
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.