Вместо того, чтобы вводить пароль несколько раз, вы можете использовать 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 <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 \
'
Для того, чтобы:
установите umask удаленного пользователя на 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с путем к файлу author_keys
cat - >> $afile - принять входные данные из STDIN и добавить в файл author_keys
sort -u $afile -o $afile - уникально сортирует файл author_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переключателей «s, -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как я сделал выше, есть несколько других доступных вариантов.