Anziché digitare la password più volte è possibile utilizzare pssh
e il relativo -A
interruttore per richiederla una volta, quindi inviare la password a tutti i server in un elenco.
NOTA: l' utilizzo di questo metodo non ti consente di utilizzarlo ssh-copy-id
, tuttavia, dovrai eseguire il rollup del tuo metodo per aggiungere il file della chiave pub SSH al file del tuo account remoto ~/.ssh/authorized_keys
.
Esempio
Ecco un esempio che fa il lavoro:
$ 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
Lo script sopra è generalmente strutturato in questo modo:
$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'
pssh
Dettagli di alto livello
cat <pubkey>
genera il file della chiave pubblica su pssh
pssh
utilizza l' -I
interruttore per inserire i dati tramite STDIN
-l <remote user>
è l'account del server remoto (supponiamo che tu abbia lo stesso nome utente tra i server nel file IP)
-A
dice pssh
di chiedere la password e di riutilizzarla per tutti i server a cui si connette
-i
indica pssh
di inviare qualsiasi output a STDOUT anziché memorizzarlo in file (comportamento predefinito)
'...cmds to add pubkey...'
- questa è la parte più delicata di ciò che sta succedendo, quindi la analizzerò da sola (vedi sotto)
Comandi in esecuzione su server remoti
Questi sono i comandi che pssh
verranno eseguiti su ciascun server:
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
In ordine:
imposta umask dell'utente remoto su 077, in modo che tutte le directory o i file che creeremo, abbiano le autorizzazioni impostate di conseguenza in questo modo:
$ 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
crea la directory ~/.ssh
e ignora avvisandoci se è già lì
- imposta una variabile,
$afile
con il percorso del file authorized_keys
cat - >> $afile
- accetta input da STDIN e accoda al file authorized_keys
sort -u $afile -o $afile
- ordina in modo univoco il file authorized_keys e lo salva
NOTA: l' ultimo bit è quello di gestire il caso in cui si esegue più volte sopra con gli stessi server. Questo eliminerà il tuo pubkey dall'essere aggiunto più volte.
Nota le singole zecche!
Prestare inoltre particolare attenzione al fatto che tutti questi comandi sono nidificati all'interno di virgolette singole. Questo è importante, dal momento che non vogliamo $afile
essere valutati fino a quando non viene eseguito sul server remoto.
' \
..cmds... \
'
Ho ampliato quanto sopra, quindi è più facile da leggere qui, ma in genere eseguo tutto su una sola riga in questo modo:
$ 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'
Materiale bonus
Utilizzando pssh
si può rinunciare dover costruire i file e sia di fornire contenuti dinamici utilizzando -h <(...some command...)
oppure è possibile creare un elenco di IP utilizzando un altro di pssh
's interruttori, -H "ip1 ip2 ip3"
.
Per esempio:
$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...
Quanto sopra potrebbe essere utilizzato per estrarre un elenco di IP dal mio ~/.ssh/config
file. Ovviamente puoi anche usare printf
per generare contenuti dinamici:
$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....
Per esempio:
$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09
Puoi anche usare seq
per generare sequenze di numeri formattati!
Riferimenti e strumenti simili a pssh
Se non si desidera utilizzare pssh
come ho già fatto sopra, ci sono alcune altre opzioni disponibili.