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