У меня есть произвольное количество серверов с одинаковой комбинацией пользователь / пароль. Я хочу написать сценарий (который я называю один раз), чтобы
ssh-copy-id user@myserver
вызывается для каждого сервера. Поскольку все они имеют одного и того же пользователя / пароль, это должно быть легко, но ssh-copy-id
я хочу, чтобы я каждый раз вводил пароль отдельно, что противоречит цели моего сценария. Там нет возможности для размещения в пароле, то есть ssh-copy-id -p mypassword user@myserver
.
Как я могу написать скрипт, который автоматически заполняет поле пароля при ssh-copy-id
запросе?
Ответы:
Посмотрите на sshpass . Поместите ваш пароль в текстовый файл и сделайте что-то вроде этого:
источник
Вы можете использовать функцию «ожидать прослушивания пароля» и отправить свой пароль:
Сохраните скрипт, сделайте его исполняемым и назовите его так:
./login.expect user@myserver
источник
spawn
? По причинам, которые я не могу контролировать, я застрял с Bash v3.2.spawn: command not found
spawn
является ключевым словом ожидаемого (см. руководство ожидаем (1)). Похоже, что скрипт интерпретируется как оболочка, а не как ожидалось. Вы ожидаете установить? Что произойдет, если вы запустите, ожидайте напрямую:expect -f login.expect user@myserver
spawn ssh-copy-id -o StrictHostKeyChecking=no $argv
Ответ Quanta довольно хороший, но он требует, чтобы вы поместили свой пароль в текстовый файл.
Из справочной страницы "sshpass":
Итак, что вы можете сделать, это захватить пароль один раз во время сценария, сохранить его в переменной, отобразить пароль и направить его в sshpass в качестве входных данных.
Я делаю это все время, и он отлично работает. Пример:
echo "Please insert the password used for ssh login on remote machine:" read -r USERPASS for TARGETIP in $@; do echo "$USERPASS" | sshpass ssh-copy-id -f -i $KEYLOCATION "$USER"@"$TARGETIP" done
источник
Это проблема с ssh-copy-id; он также добавляет ключ каждый раз, когда вы запускаете его. Если вы автоматизируете процесс, ваш файл author_keys быстро загромождается дубликатами ключей. Вот программа на Python, которая позволяет избежать обеих проблем. Он запускается с управляющего сервера и помещает ключи с одного удаленного сервера на другой удаленный сервер.
источник
Вместо того, чтобы вводить пароль несколько раз, вы можете использовать
pssh
его и его-A
переключатель, чтобы запросить его один раз, а затем передать пароль всем серверам в списке.ПРИМЕЧАНИЕ. Использование этого метода не позволяет использовать его
ssh-copy-id
, поэтому вам нужно будет применить собственный метод для добавления файла ключа публикации SSH в файл удаленной учетной записи~/.ssh/authorized_keys
.пример
Вот пример, который делает работу:
Приведенный выше скрипт обычно имеет такую структуру:
pssh
Детали высокого уровняcat <pubkey>
выводит файл открытого ключа вpssh
pssh
использует-I
переключатель для приема данных через STDIN-l <remote user>
учетная запись удаленного сервера (мы предполагаем, что у вас одинаковое имя пользователя на серверах в файле IP)-A
говоритpssh
попросить ваш пароль и затем повторно использовать его для всех серверов, к которым он подключается-i
приказываетpssh
отправлять любой вывод в STDOUT, а не сохранять его в файлах (поведение по умолчанию)'...cmds to add pubkey...'
- это самая сложная часть того, что происходит, поэтому я разобью это сам (см. ниже)Команды, выполняемые на удаленных серверах
Это команды, которые
Для того, чтобы:pssh
будут выполняться на каждом сервере:установите umask удаленного пользователя на 077, так что любые каталоги или файлы, которые мы собираемся создать, будут иметь соответствующие права доступа следующим образом:
создать каталог
~/.ssh
и игнорировать предупреждение, если оно уже есть$afile
с путем к файлу author_keyscat - >> $afile
- принять входные данные из STDIN и добавить в файл author_keyssort -u $afile -o $afile
- уникально сортирует файл author_keys и сохраняет егоПРИМЕЧАНИЕ. Этот последний бит предназначен для обработки случая, когда вы запускаете вышеуказанное несколько раз на одних и тех же серверах. Это исключит возможность добавления вашего pubkey несколько раз.
Обратите внимание на одиночные галочки!
Также обратите особое внимание на то, что все эти команды вложены в одинарные кавычки. Это важно, поскольку мы не хотим
$afile
получать оценку до тех пор, пока она не будет выполнена на удаленном сервере.Я расширил вышеописанное, чтобы его было легче читать, но я обычно запускаю все это в одну строку, например:
Бонусный материал
С помощью
pssh
вы можете отказаться от того , чтобы построить файлы и либо обеспечить динамическое содержимое , используя-h <(...some command...)
или вы можете создать список IP - адреса с помощью другихpssh
переключателей «s,-H "ip1 ip2 ip3"
.Например:
Выше можно использовать для извлечения списка IP-адресов из моего
~/.ssh/config
файла. Конечно, вы также можете использоватьprintf
для создания динамического контента:Например:
Вы также можете использовать
seq
для генерации последовательности чисел тоже!Ссылки и аналогичные инструменты для
pssh
Если вы не хотите использовать,
pssh
как я сделал выше, есть несколько других доступных вариантов.источник
Ansible's authorized_key_module
Кажется, не работа для новой машины. Сначала я должен использовать ssh-copy-id xxx, поэтому я ищу способ просто использовать ansible add ssh-key для новой машины, понимаете?Вам может подойти один из инструментов параллельного SSH (clusterssh, mssh, pssh).
Например, используйте cssh для входа на все машины и добавления ключа самостоятельно.
источник
Пара вещей, которые могут соответствовать всем требованиям:
Как упоминалось в других ответах, sshpass, вероятно, самое простое решение.
источник
Я хочу подчеркнуть, насколько плоха идея:
Вот реализация, которая немного более безопасна ...
источник