Tengo un número arbitrario de servidores con la misma combinación de usuario / pase. Quiero escribir un guión (que llamo una vez) para que
ssh-copy-id user@myserver
se llama para cada servidor. Dado que todos tienen el mismo usuario / pase, esto debería ser fácil, pero ssh-copy-id
quiere que escriba la contraseña por separado cada vez, lo que anula el propósito de mi script. No hay opción para ingresar una contraseña, es decir ssh-copy-id -p mypassword user@myserver
.
¿Cómo puedo escribir un script que complete automáticamente el campo de contraseña cuando lo ssh-copy-id
solicite?
Respuestas:
Echa un vistazo a sshpass . Coloque su contraseña en un archivo de texto y haga algo como esto:
fuente
Puede usar esperar escuchar el mensaje de contraseña y enviar su contraseña:
Guarde el script, hágalo ejecutable y llámelo como:
./login.expect user@myserver
fuente
spawn
? Por razones que no puedo controlar, estoy atascado con bash v3.2.spawn: command not found
spawn
es una palabra clave de esperar (consulte el manual de esperar (1)). Parece que el script se interpreta como shell en lugar de esperar. ¿Tienes esperar instalado? ¿Qué ocurre si se ejecuta directamente esperar:expect -f login.expect user@myserver
spawn ssh-copy-id -o StrictHostKeyChecking=no $argv
La respuesta de quanta es bastante buena, pero requiere que coloque su contraseña en un archivo de texto.
Desde la página del comando man "sshpass":
Por lo tanto, lo que puede hacer es capturar la contraseña una vez durante la secuencia de comandos, almacenarla en una variable, hacer eco de la contraseña y canalizar eso para pasar sshpass como entrada.
Hago esto todo el tiempo y funciona bien. Ejemplo:
echo "Please insert the password used for ssh login on remote machine:" read -r USERPASS for TARGETIP in $@; do echo "$USERPASS" | sshpass ssh-copy-id -f -i $KEYLOCATION "$USER"@"$TARGETIP" done
fuente
Este es un problema con ssh-copy-id; También agrega una clave cada vez que la ejecutas. Si está automatizando el proceso, su archivo Author_keys se llena rápidamente con claves duplicadas. Aquí hay un programa de Python que evita ambos problemas. Se ejecuta desde el servidor de control y coloca las claves de un servidor remoto en otro servidor remoto.
fuente
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 está estructurado 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 configurados 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 con formato!Referencias y herramientas similares a
pssh
Si no desea usar
pssh
como lo he hecho anteriormente, hay algunas otras opciones disponibles.fuente
Ansible's authorized_key_module
Parece que no funciona para una nueva máquina. Primero tengo que ssh-copy-id xxx, así que estoy buscando una forma de usar ansible add ssh-key para una nueva máquina, ¿alguna idea?Una de las herramientas paralelas de SSH (clusterssh, mssh, pssh) puede ser adecuada para usted.
Por ejemplo, use cssh para iniciar sesión en todas las máquinas y agregar la clave usted mismo.
fuente
Un par de cosas que podrían cumplir con los requisitos:
Como se mencionó en otras respuestas, sshpass es probablemente la solución más fácil.
fuente
Quiero enfatizar cuán mala idea es:
Aquí hay una implementación que es un poco más segura ...
fuente