Автоматизация ssh-copy-id

Вы используете Internet Explorer в качестве своего веб-браузера?

Когда Вы нажимаете: Инструменты-> интернет-Опции-> Соединения (вкладка)-> настройки локальной сети (кнопка) Вы видите "Использование автоматический сценарий конфигурации"? Раз так это - вероятно, веб-проблема прокси.

В противном случае затем, возможно, у Вас есть проблема брандмауэра, посредством чего маршрутизатор или даже Ваши веб-приложения, имеет список позволенного дюйм/с, который может просмотреть те веб-сайты; в этом случае Вам, вероятно, придется попросить, чтобы Ваш администратор сети предоставил Ваш доступ IP-адреса к тому веб-сайту.

29
задан 30 August 2011 в 21:17
8 ответов

Взгляните на sshpass . Поместите свой пароль в текстовый файл и сделайте что-то вроде этого:

$ sshpass -f password.txt ssh-copy-id user@yourserver
27
ответ дан 28 November 2019 в 20:00

Существует три основных подхода к проблеме запрета пользователю завершать программу. У всех есть недостатки, и ХОРОШЕГО решения вашей проблемы нет.

По сути, если у пользователя есть права администратора на машине, они будут иметь возможность завершить процесс (хотя они могут не знать как)

  • Подход 1 : Создайте любую программу, которую вы запускаете как службу, и отметьте ее как неудержимую. (недостатки: если вы используете Windows Vista и выше, он будет заблокирован в сеансе 0 и не сможет взаимодействовать с рабочим столом пользователя, однако вы все равно можете получать уведомления о входе в систему и выходе из системы и реагировать соответствующим образом.)

  • Подход 2 : Создать вспомогательное приложение, которое также запускает и перезапускает исходное приложение при завершении. Бонусные баллы, если вы создаете приложение для перезапуска вспомогательного приложения, если оно закрыто. (недостатков слишком много, чтобы перечислить, на данном этапе вы идете по пути вредоносного ПО.)

  • Подход 3 : Создайте дополнительную службу, которая отслеживает запрос на завершение процесса и отменяет его. Я не собираюсь больше объяснять, как это сделать, поскольку на ум приходит слово руткит.user @ myserver

19
ответ дан 28 November 2019 в 20:00

Один из параллельных инструментов SSH (clusterssh, mssh, pssh) может вам подойти.

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

1
ответ дан 28 November 2019 в 20:00

Это проблема с ssh-copy-id; он также добавляет ключ каждый раз, когда вы его запускаете. Если вы автоматизируете процесс, ваш файл authorized_keys быстро забивается повторяющимися ключами. Вот программа Python, которая позволяет избежать обеих проблем. Он запускается с управляющего сервера и помещает ключи с одного удаленного сервера на другой удаленный сервер.

import subprocess
def Remote(cmd,IP):
    cmd = '''ssh root@%s '''%(IP)+cmd
    lines = subprocess.check_output(cmd.split())
    return '\n'.join(lines)
source = '123.456.78.90'
target = '239.234.654.123'
getkey = 'cat /root/.ssh/id_rsa.pub'
getauth = 'cat /root/.ssh/authorized_keys'
sourcekey = Remote(getkey, source).replace('\n','').strip()
authkeys = Remote(getauth, target).replace('\n','').strip()
if sourcekey not in authkeys: 
    keycmd=''' echo "%s" >>/root/.ssh/authorized_keys; 
    chmod 600 /root/.ssh/authorized_keys '''%(sourcekey) # A compound shell statement
    print 'Installed key', Remote(keycmd,target)
else: print 'Does not need key'
2
ответ дан 28 November 2019 в 20:00

Пара вещей, которые могут соответствовать всем требованиям:

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

0
ответ дан 28 November 2019 в 20:00

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

ПРИМЕЧАНИЕ. Использование этого метода не позволяет использовать ssh-copy-id , однако вам нужно будет применить свой собственный метод для добавления файла ключа публикации SSH в файл ~ / .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 выводит файл открытого ключа в pssh
  • pssh использует переключатель -I для приема данных через STDIN
  • -l <удаленный пользователь> - это учетная запись удаленного сервера (мы предполагаем, что у вас одно и то же имя пользователя на всех серверах в IP-файле)
  • -A сообщает pssh , чтобы запросить ваш пароль, а затем повторно использовать его для всех серверов, к которым он подключается.
  • -i указывает pssh отправлять любой вывод в STDOUT, а не хранить его в файлах (поведение по умолчанию )
  • '... cmds для добавления pubkey ...' - это самая сложная часть того, что происходит, поэтому я разобью это отдельно (см. Ниже)

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

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

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

     $ ls -ld ~ / .ssh ~ / .ssh / authorized_keys
    drwx ------ 2 remoteuser remoteuser 4096 21 мая, 22:58 /home/remoteuser/.ssh
     -rw ------- 1 удаленный пользователь удаленный пользователь 771 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 , -H "ip1 ip2 ip3" .

Например:

$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...

Вышеупомянутое можно использовать для извлечения списка IP-адресов из моего файла ~ / .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

Вы также можете использовать seq для генерации последовательностей форматированных чисел!

Ссылки & аналогичные инструменты для pssh

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

2
ответ дан 28 November 2019 в 20:00

Я хочу подчеркнуть, насколько плохая идея:

  1. Использовать жестко запрограммированный пароль в ваших сценариях
  2. Использовать один и тот же пароль на ВСЕХ ваших серверах .. .like ... почему!?
  3. НЕ используйте SSH-аутентификацию public_key + пароль, если вы настаиваете на этом
  4. Сохраните пароль в текстовом файле

Вот реализация, которая немного более безопасна ...

#!/usr/bin/python3
import os
import getpass
import argparse

parser = argparse.argument_parser()
parser.add_argument('-l','--login', action='store', help='username')
parser.add_argument('-p','--port', action='store', default='22', help='port')
parser.add_argument('-L','--list', action='store', help='file list of IPs')
parser.add_argument('-i','--ip-address', action='store', nargs='+', metavar='host' help='ip or list of ips')

args = parser.parse_args()
if not args.login:
    print("You need a login, broski!")
    return 0

if args.list:
    ips = [i for i in open(args.list, 'r').readlines()]
    passwd = getpass.getpass('Password: ')

    for ip in ips:
        cmd = 'ssh-id-copy {0}@{1} -p {2}'.format(ip,args.port,passwd)            
        os.system('sshpass -p ' + passwd + ' ' + cmd)
        print("Key added: ", ip)   # prints if successful
        # ex: sshpass -p passwd ssh-id-copy login@1.1.1.1

elif args.host:
    ip = args.host
    cmd = 'ssh-id-copy {0}@{1} -p {2}'.format(ip,args.port,passwd)
    os.system('sshpass -p ' + passwd + ' ' + cmd)
    print("Key added: ", ip)   # prints if successful
else:
    print("No IP addresses were given to run script...")
    return 0 
0
ответ дан 28 November 2019 в 20:00

Ответ Quanta довольно хорош, но он требует, чтобы вы поместили свой пароль в текстовый файл.

Из справочной страницы "sshpass":

Если опция не указана, sshpass читает пароль из стандартного input.

Итак, что вы можете сделать, так это захватить пароль один раз во время выполнения сценария, сохранить его в переменной, вывести пароль и передать его sshpass в качестве входных данных.

Я делаю это постоянно, и все работает нормально. Пример: echo "Пожалуйста, введите пароль, используемый для входа по ssh на удаленном компьютере:" читать -r USERPASS для TARGETIP в $ @; делать echo "$ USERPASS" | sshpass ssh-copy-id -f -i $ KEYLOCATION "$ USER" @ "$ TARGETIP" сделанный

3
ответ дан 28 November 2019 в 20:00

Теги

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