Recientemente me dieron acceso de nombre de usuario / contraseña a una lista de servidores y quiero propagar mi clave pública SSH a estos servidores, para que pueda iniciar sesión más fácilmente.
Para que quede claro:
- No hay ninguna clave pública preexistente en los servidores remotos que pueda utilizar para automatizar esto
- Esto constituye la primera vez que inicio sesión en estos servidores, y me gustaría no tener que escribir constantemente mis credenciales para acceder a ellos.
- Tampoco quiero escribir mi contraseña una y otra vez usando
ssh-copy-id
un bucle for.
ssh-copy-id
, bombeando mi contraseña una y otra vez.Respuestas:
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:
El script anterior generalmente se estructura de la siguiente manera:
pssh
Detalles de alto nivelcat <pubkey>
saca el archivo de clave pública apssh
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 dicepssh
que solicite su contraseña y luego la reutilice para todos los servidores a los que se conecta-i
le dicepssh
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
En orden:pssh
se ejecutarán en cada servidor: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:
crea el directorio
~/.ssh
e ignora avisándonos si ya está allí$afile
con la ruta al archivo autorizado_clavescat - >> $afile
- tome la entrada de STDIN y anexe al archivo autorizado_clavessort -u $afile -o $afile
- clasifica de forma única el archivo autorizado_claves y lo guardaNOTA: 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.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í:
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 lospssh
interruptores 's,-H "ip1 ip2 ip3"
.Por ejemplo:
Lo anterior podría usarse para extraer una lista de IP de mi
~/.ssh/config
archivo. Por supuesto, también puede usarprintf
para generar contenido dinámico:Por ejemplo:
¡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.fuente
pssh
es un script de Python, y se puede instalar conpip install pssh
. (2) También se pueden generarssh
las claves de todos los servidores de forma simultánea mediante la ejecuciónssh-keygen
a travéspssh
. (3) Después de generar las claves, puede distribuir las claves "todo a todos" copiando todas las claves públicas en un bucle a la máquina local, ensamblándolas en un comúnauthorized_keys
y copiándolas en cada máquina.ssh_agent
/ssh_add
puedo ayudar con las contraseñas.cat
award (of old): para comenzar una canalización con el contenido de un archivo, simplemente puede redirigir la entrada de ese archivo.pssh
.cat ~/.ssh/*.pub | ...
. Sin embargo, puede o no ser lo que quieres en esta situación.Alternativa usando
xargs
,sshpass
yssh-copy-id
:Suponiendo que sus credenciales vivan en credentials.txt en formato
user:password@server
:Podrías hacerlo:
Nota: ¡Recuerde eliminar credentials.txt después del uso!
fuente
ClusterSSH le ofrece una ventana en cada máquina y una ventana común para controlar todas las ventanas.
Si estamos hablando de 10 máquinas, esto funcionará. Si estamos hablando de 100 máquinas, habrá muchas ventanas.
La belleza de ClusterSSH es que si una máquina no es 100% como el resto, simplemente puede hacer clic en la ventana y enviar pulsaciones de teclas solo a esa máquina antes de volver a enviar pulsaciones de teclas a todas las máquinas.
fuente
Usar Ansible es bastante simple. Simplemente reemplace
<USER>
con el nombre de inicio de sesión realfuente
Un par de cosas que podrían ajustarse a la factura:
Como se menciona en otras respuestas,
sshpass
es probable que sea la solución más fácil.fuente
Tienes dos opciones aquí:
Puede crear un archivo con todas las direcciones IP de los servidores, luego haga lo siguiente
Asumiendo
servers.txt
es el archivo con IP / nombres de host.Puede poner todas sus direcciones IP / nombres de host en un bucle y ejecutar
ssh-copy-id
como a continuación:fuente
ssh-copy-id
en un bucle for".