Неинтерактивный одноразовый ssh ​​&& scp для 100 серверов

1

Мне нужно скопировать некоторые данные из кластера очень ограниченных машин через сеть, которая в настоящее время имеет проблемы с DNS (поэтому некоторые соединения странно не работают). Я обнаружил, что единственный способ скопировать данные с компьютера - запустить scp с этого компьютера. На данный момент рабочий процесс:

  1. для каждой машины в машинах
  2. ssh machine
  3. введите пароль
  4. scp files destination:results
  5. введите пароль
  6. Подождите
  7. повторить навсегда

Я схожу с ума от этого ручного труда. Я хочу решение, которое позволяет мне вводить пароль один раз. Я искал решения. Большинство рекомендует установить ключи SSH, но для их распространения требуется та же процедура. Другие упоминают expect программа, но у меня ее нет в этой системе.

Как это можно сделать?

Обновить: Основной компьютер работает под управлением FreeBSD 9, а 100 серверов работают под управлением Ubuntu 12. У меня нет рута на любой машине.

Ark-kun
источник
Есть ли разные пароли для каждой машины?
terdon
Имя пользователя и пароль совпадают.
Ark-kun
Какую ОС вы используете? Если Linux, какой дистрибутив?
terdon
@terdon Основная машина работает под управлением FreeBSD 9, а 100 серверов работают под управлением Ubuntu 12. P.S. У меня нет рута на любой машине.
Ark-kun
Возьмите за правило распространять свои открытые ключи SSH, как только вы получите доступ к любому серверу в течение всей своей жизни, и вы всегда будете благодарны. Тем не менее, когда я получаю доступ к большим партиям серверов сразу, я запускаю: for s in $LIST_OF_SERVERS; do ssh-copy-id $s; done и поместите мой пароль (плюс перевод строки) в буфер обмена. Ручной труд все еще, но идет по логике, и, опять же, нужно будет сделать только один раз для каждого сервера.
Ekevoo

Ответы:

3

Я предполагаю, что это все хосты Linux и что у вас есть доступ к ним root. Я также предполагаю, что они используют apt для управления пакетами, но это решение легко применить с yum или же pacman или любой другой менеджер пакетов.

Насколько я знаю, ssh не предлагает способ указать пароль в командной строке, поэтому сначала вам нужно будет установить sshpass на вашей локальной машине:

sudo apt-get install sshpass

Это позволит вам передать пароль в качестве аргумента командной строки:

sshpass -p '<password>' ssh user@server

Теперь создайте файл со всеми интересующими вас IP-адресами, по одному на строку. Вы можете разобрать этот файл для установки sshpass на каждой удаленной машине. Если ваш пароль foo и вы подключаетесь как root, ты можешь сделать

while read ip; do 
 sshpass -p 'foo' ssh root@$ip "apt-get install sshpass"; 
done < ips.txt

sshpass теперь установлен на каждом сервере. Теперь снова пройдитесь по серверам и скопируйте ваши файлы. Если вы копируете как root и root пароль для вашего destination является bar, сделай это:

while read ip; do 
 sshpass -p 'foo' ssh root@$ip "sshpass -p 'bar' scp files dest:/results/"; 
done < ips.txt

Вы также можете использовать sshpass скопировать файлы ключей и - если вы использовали пустую фразу-пароль - разрешить доступ без пароля, чтобы в следующий раз у вас не возникло этой проблемы:

while read ip; do 
   sshpass -p 'foo' ssh root@$ip \
      "sshpass -p 'bar' ssh-copy-id -i ~/.ssh/id_rsa.pub root@destination";
done < ips.txt

Как только это будет сделано, вы сможете скопировать файлы, используя:

while read ip; do ssh root@$ip "scp files dest:/results/"; done < ips.txt
terdon
источник
Извините, не заметили ваш ответ. Моя проблема в том, что у меня не было рута ни на одной машине. Основная машина имела FreeBSD 9, а на 100 серверах была Ubuntu 12.
Ark-kun
@ Арк-кун, это проблема. Вы могли бы упростить вещи, запустив scp от вашей машины, таким образом, по крайней мере, вам не нужно ssh: scp user@ip:/remote/path /local/path, Затем, если вы скопируете свой пароль в буфер обмена, вы можете просто нажать среднюю кнопку мыши 100 раз, чтобы ввести пароль.
terdon
В то время я не мог запустить scp с основной машины из-за некоторых странных проблем, связанных с DNS. Это работало только по-другому. Спасибо за предложение. Есть ли sshpass действительно требуется рут?
Ark-kun
@ Арк-кун нет, только чтобы установить его в первый раз.
terdon
Я имел в виду "Можно ли использовать предложенное вами решение без рутирования где-нибудь?" Что если я соберу sshpass из исходного кода и пропущу менеджер пакетов? Я думаю, нет.
Ark-kun