Замість того, щоб вводити свій пароль кілька разів, ви можете скористатися pssh
і його -A
перемикачем, щоб запросити його один раз, а потім подати пароль на всі сервери в списку.
ПРИМІТКА: Використання цього методу не дозволяє використовувати ssh-copy-id
, однак, вам потрібно буде прокрутити свій власний метод для додавання файлу ключа SSH pub до файлу віддаленого облікового запису ~/.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
із шляхом до файлу санкціонованих_ ключів
cat - >> $afile
- взяти вхід зі STDIN та додати до файла дозволених ключів
sort -u $afile -o $afile
- унікально сортує файл санкціонованого_кейса та зберігає його
ПРИМІТКА. Останнім бітом є обробка випадку, коли ви запускаєте вищезазначені кілька разів на одних і тих же серверах. Це дозволить уникнути додавання вашого віскі кілька разів.
Помітьте одиночні кліщі!
Також зверніть особливу увагу на те, що всі ці команди вкладені всередині одиничних лапок. Це важливо, оскільки ми не хочемо $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
як я це робив вище, доступні інші варіанти.