En lugar de escribir su contraseña varias veces, puede utilizar pssh
y su -A
interruptor para solicitarla una vez, y luego alimentar la contraseña a todos los servidores en una lista.
NOTA:ssh-copy-id
Sin embargo, el uso de este método no le permite usarlo , por lo que deberá utilizar su propio método para agregar su archivo de clave de publicación SSH al archivo de su cuenta remota ~/.ssh/authorized_keys
.
Ejemplo
Aquí hay un ejemplo que hace el trabajo:
$ 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
El script anterior generalmente se estructura de la siguiente manera:
$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'
pssh
Detalles de alto nivel
cat <pubkey>
saca el archivo de clave pública a pssh
pssh
usa el -I
interruptor para ingerir datos a través de STDIN
-l <remote user>
es la cuenta del servidor remoto (asumimos que tiene el mismo nombre de usuario en todos los servidores en el archivo IP)
-A
le dice pssh
que solicite su contraseña y luego la reutilice para todos los servidores a los que se conecta
-i
le dice pssh
que envíe cualquier salida a STDOUT en lugar de almacenarla en archivos (su comportamiento predeterminado)
'...cmds to add pubkey...'
- esta es la parte más complicada de lo que está sucediendo, así que lo desglosaré solo (ver más abajo)
Comandos que se ejecutan en servidores remotos
Estos son los comandos que pssh
se ejecutarán en cada servidor:
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
En orden:
configure la umask del usuario remoto en 077, esto es para que cualquier directorio o archivo que creemos tenga sus permisos establecidos de la siguiente manera:
$ 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 el directorio ~/.ssh
e ignora avisándonos si ya está allí
- establecer una variable,
$afile
con la ruta al archivo autorizado_claves
cat - >> $afile
- tome la entrada de STDIN y anexe al archivo autorizado_claves
sort -u $afile -o $afile
- clasifica de forma única el archivo autorizado_claves y lo guarda
NOTA: El último bit es manejar el caso en el que ejecuta lo anterior varias veces contra los mismos servidores. Esto evitará que su pubkey se agregue varias veces.
¡Observe las marcas individuales!
También preste especial atención al hecho de que todos estos comandos están anidados dentro de comillas simples. Eso es importante, ya que no queremos $afile
ser evaluados hasta después de que se esté ejecutando en el servidor remoto.
' \
..cmds... \
'
He expandido lo anterior para que sea más fácil de leer aquí, pero generalmente lo ejecuto todo en una sola línea así:
$ 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'
Material de bonificación
Mediante el uso pssh
se puede renunciar a tener que construir archivos y, o bien proporcionar contenido dinámico utilizando -h <(...some command...)
o puede crear una lista de direcciones IP utilizando otro de los pssh
interruptores 's, -H "ip1 ip2 ip3"
.
Por ejemplo:
$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...
Lo anterior podría usarse para extraer una lista de IP de mi ~/.ssh/config
archivo. Por supuesto, también puede usar printf
para generar contenido dinámico:
$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....
Por ejemplo:
$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09
¡También puedes usar seq
para generar secuencias de números formateadas!
Referencias y herramientas similares a pssh
Si no desea usar pssh
como lo he hecho anteriormente, hay algunas otras opciones disponibles.