Мне недавно дали имя пользователя / пароль доступа к списку серверов, и я хочу распространить свой открытый ключ SSH на эти серверы, чтобы мне было проще войти в систему.
Так что понятно
- На удаленных серверах отсутствует какой-либо ранее открытый открытый ключ, который я мог бы использовать для автоматизации этого процесса.
- Это первый раз, когда я захожу на эти серверы, и мне не нужно постоянно вводить свои учетные данные для доступа к ним.
- Также я не хочу вводить свой пароль снова и снова, используя
ssh-copy-id
цикл for.
ssh-copy-id
, перекачивая мой пароль снова и снова.Ответы:
Вместо того, чтобы вводить пароль несколько раз, вы можете использовать
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
как я сделал выше, есть несколько других доступных вариантов.источник
pssh
это скрипт на Python, который можно установить с помощьюpip install pssh
. (2) Вы также можете генерироватьssh
ключи на всех серверах одновременно, выполнивssh-keygen
черезpssh
. (3) После генерации ключей вы можете распространять ключи «все на все», копируя все открытые ключи в цикле на локальный компьютер, собирая их в общийauthorized_keys
и копируя их на каждый компьютер.ssh_agent
/ssh_add
может помочь с паролями.cat
наград (старого): чтобы запустить конвейер с содержимым файла, вы можете просто перенаправить ввод из этого файла.pssh
.cat ~/.ssh/*.pub | ...
. Это может или не может быть тем, что вы хотите в этой ситуации, хотя.Альтернативное использование
xargs
,sshpass
иssh-copy-id
:Предполагая, что ваши учетные данные живут в credentials.txt в формате
user:password@server
:Вы могли бы сделать:
Примечание: не забудьте удалить credentials.txt после использования!
источник
ClusterSSH дает вам окно на каждой машине и с общим окном для управления всеми окнами.
Если мы говорим 10 машин, это будет работать. Если речь идет о 100 машинах, будет много окон.
Прелесть ClusterSSH в том, что если одна машина не на 100% похожа на другую, вы можете просто щелкнуть окно и отправить нажатия клавиш только на эту машину, прежде чем вернуться к отправке нажатий клавиш на все машины.
источник
Использовать Ansible довольно просто. Просто замените
<USER>
реальным логиномисточник
Пара вещей, которые потенциально могут отвечать всем требованиям:
Как уже упоминалось в других ответах,
sshpass
это, вероятно, самое простое решение.источник
У вас есть два варианта здесь:
Вы можете создать файл со всеми IP-адресами серверов, а затем сделать следующее
Предполагается,
servers.txt
что это файл с IP-адресами / именами хостов.Вы можете поместить все свои IP-адреса / имена хостов в цикл и запустить,
ssh-copy-id
как показано ниже:источник
ssh-copy-id
цикл for».