Как я могу распространять свой ключ SSH pub в список серверов без необходимости вводить мой пароль снова и снова?

Недавно мне был предоставлен доступ к имени пользователя и паролю к списку серверов и я хочу распространять свой открытый SSH-ключ на эти серверы, чтобы я мог легко войти в систему.

Итак, это понятно:

  • На удаленных серверах не существует ранее существовавшего открытого ключа, который я могу использовать для автоматизации этого
  • Это первый раз, когда я вхожу в систему на этих серверах, и мне не нужно будет постоянно вводить мои учетные данные для доступа к ним.
  • Я также не хочу вводить свой пароль снова и снова, используя ssh-copy-id в цикле for.
25 голосов | спросил slm 22 Mayam15 2015, 07:21:36

6 ответов


30

Вместо того, чтобы вводить пароль несколько раз, вы можете использовать pssh и его -A, чтобы запросить его один раз, а затем передать пароль всем серверам в списке.

ПРИМЕЧАНИЕ. Использование этого метода не позволяет использовать ssh-copy-id, однако, вам нужно перевернуть свой собственный метод добавления вашего ключевого файла SSH pub в файл ~/.ssh/authorized_keys вашей удаленной учетной записи.

Пример

Вот пример, который выполняет задание:

$ cat ~/.ssh/my_id_rsa.pub                    \
    | pssh -h ips.txt -l remoteuser -A -I -i  \
    '                                         \
      umask 077;                              \
      mkdir -p ~/.ssh;                        \
      afile=~/.ssh/authorized_keys;           \
      cat - >> $afile;                        \
      sort -u $afile -o $afile                \
    '
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 23:03:58 [SUCCESS] 10.252.1.1
[2] 23:03:58 [SUCCESS] 10.252.1.2
[3] 23:03:58 [SUCCESS] 10.252.1.3
[4] 23:03:58 [SUCCESS] 10.252.1.10
[5] 23:03:58 [SUCCESS] 10.252.1.5
[6] 23:03:58 [SUCCESS] 10.252.1.6
[7] 23:03:58 [SUCCESS] 10.252.1.9
[8] 23:03:59 [SUCCESS] 10.252.1.8
[9] 23:03:59 [SUCCESS] 10.252.1.7

Вышеприведенный скрипт обычно структурирован так:

$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'

Высокий уровень pssh подробнее

  • cat <pubkey> выводит файл открытого ключа на pssh
  • pssh использует переключатель -I для доступа к данным через STDIN
  • -l <remote user> - это учетная запись удаленного сервера (мы предполагаем, что у вас одинаковое имя пользователя на серверах в IP-файле)
  • -A сообщает pssh, чтобы запросить ваш пароль а затем повторно использовать его для всех серверов, к которым он подключается, к
  • -i сообщает pssh для отправки любого результата на STDOUT, а не хранить его в файлах (по умолчанию)
  • '...cmds to add pubkey...' - это самая сложная часть того, что происходит, поэтому я сам сломаю это (см. ниже)

Команды, выполняемые на удаленных серверах

Это команды, которые pssh будут запускаться на каждом сервере:

'                                         \
  umask 077;                              \
  mkdir -p ~/.ssh;                        \
  afile=~/.ssh/authorized_keys;           \
  cat - >> $afile;                        \
  sort -u $afile -o $afile                \
'
В порядке:
  • установите uumask удаленного пользователя на 077, это значит, что любые каталоги или файлы, которые мы собираемся создать, будут иметь свои разрешения соответственно:

    $ ls -ld ~/.ssh ~/.ssh/authorized_keys
    drwx------ 2 remoteuser remoteuser 4096 May 21 22:58 /home/remoteuser/.ssh
    -rw------- 1 remoteuser remoteuser  771 May 21 23:03 /home/remoteuser/.ssh/authorized_keys
    
  • создать каталог ~/.ssh и игнорировать предупреждение, если он уже существует

  • установить переменную, $afile, с указанием пути к файлу authorized_keys
  • cat - >> $afile - введите данные из STDIN и добавьте в файл authorized_keys
  • sort -u $afile -o $afile - уникально сортирует файл authorized_keys и сохраняет его

ПРИМЕЧАНИЕ. . Этот последний бит предназначен для обработки случая, когда вы выполняете указанные выше несколько раз против тех же серверов. Это приведет к тому, что ваш pubkey не будет добавлен несколько раз.

Обратите внимание на одиночные тики!

Также обратите особое внимание на то, что все эти команды вложены внутри одинарных кавычек. Это важно, так как мы не хотим, чтобы $afile оценивался до тех пор, пока он не будет выполняться на удаленном сервере.

'               \
   ..cmds...    \
'

Я расширил выше, так что читать здесь легче, но я обычно запускаю все это в одной строке:

$ cat ~/.ssh/my_id_rsa.pub | pssh -h ips.txt -l remoteuser -A -I -i 'umask 077; mkdir -p ~/.ssh; afile=~/.ssh/authorized_keys; cat - >> $afile; sort -u $afile -o $afile'

Бонусный материал

Используя pssh, вы можете отказаться от создания файлов и предоставить динамический контент с помощью -h <(...some command...) или вы можете создать список IP-адресов, используя другой переключатель pssh, ---- +: = 30 =:. + ----

Например:

-H "ip1 ip2 ip3"

Вышеприведенное может быть использовано для извлечения списка IP-адресов из моего файла $ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ... . Вы также можете использовать ~/.ssh/config для создания динамического содержимого:

printf

Например:

$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....

Вы также можете использовать $ printf "%s\n" srv0{0..9} srv00 srv01 srv02 srv03 srv04 srv05 srv06 srv07 srv08 srv09 для создания форматированных номеров чисел!

Ссылки и amp; аналогичные инструменты для seq

Если вы не хотите использовать pssh, как я сделал это выше,есть некоторые другие доступные варианты.

ответил slm 22 Mayam15 2015, 07:21:36
7

Альтернативное использование xargs, sshpass и ssh-copy-id:

Предполагая, что ваши учетные данные проживают в credentials.txt в формате user:[email protected]:

$ cat credentials.txt
root:[email protected]
foo:[email protected]
bar:[email protected]

Вы можете сделать:

tr ':@' '\n' < credentials.txt \
| xargs -L3 sh -c 'sshpass -p $1 ssh-copy-id [email protected]$2'

Примечание. Не забудьте удалить credentials.txt после использования!

ответил FloHimself 22 Mayam15 2015, 10:13:28
6

ClusterSSH дает вам окно на каждой машине и с общим окном для управления всеми окнами.

Если мы говорим о 10 машинах, это сработает. Если мы говорим о 100 машинах, будет много окон.

Красота ClusterSSH заключается в том, что если одна машина не на 100% похожа на остальную, вы можете просто щелкнуть по ней и отправить нажатия клавиш только на эту машину, прежде чем вернуться к отправке нажатий клавиш на все компьютеры.

ответил Ole Tange 22 Maypm15 2015, 13:41:49
6

Использование Ansible довольно просто. Просто замените <USER> на реальное имя пользователя

$ cd /path/to/public/key

$ cat<<END > hosts
  host1.example.com
  10.10.10.10
  END

$ ansible -i hosts all --ask-pass -u <USER> -m authorized_key \
      -a "user=<USER> key='$(cat id_rsa.pub)'"        
ответил Daniel Wakefield 22 Maypm15 2015, 18:37:17
0

Пара вещей, которые могут потенциально соответствовать счету:

Как упоминалось в других ответах, sshpass, вероятно, самое простое решение.

ответил Richlv 27 FebruaryEurope/MoscowbSat, 27 Feb 2016 21:45:48 +0300000000pmSat, 27 Feb 2016 21:45:48 +030016 2016, 21:45:48
-1

У вас есть два варианта:

  • Вы можете создать файл со всеми IP-адресами серверов, а затем сделать ниже

    while read -r ip;do
      ssh-copy-id -i .ssh/id_rsa.pub $ip
    done < servers.txt
    

Предполагая, что servers.txt - это файл с IP-адресами /именами хостов.

  • Вы можете поместить все ваши IP-адреса /имена хостов в цикл и запустить ssh-copy-id, как показано ниже:

    for i in hostname1 hostname2
      do ssh-copy-id -i .ssh/id_rsa.pub $i
    done
    
ответил Tolga Ozses 23 Maypm15 2015, 20:48:37

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132