1

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

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

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

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

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

1 ответ1

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

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