Ingrese automáticamente la contraseña de SSH con la secuencia de comandos

Necesito crear una secuencia de comandos que ingrese automáticamente una contraseña para el cliente OpenSSH ssh .

Digamos que necesito SSH en myname@somehost con la contraseña a1234b .

Ya lo intenté …

 #~/bin/myssh.sh ssh myname@somehost a1234b 

…Pero esto no funciona.

¿Cómo puedo obtener esta funcionalidad en un script?

Primero necesita instalar sshpass .

  • Ubuntu / Debian: apt-get install sshpass
  • Fedora / CentOS: yum install sshpass
  • Arco: pacman -S sshpass

Ejemplo:

 sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM 

Ejemplo de puerto personalizado:

 sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no YOUR_USERNAME@SOME_SITE.COM:2400 

Notas:

  • sshpass también puede leer una contraseña de un archivo cuando se pasa el sshpass -f .
    • El uso de -f evita que la contraseña sea visible si se ejecuta el comando ps .
    • El archivo en el que se almacena la contraseña debe tener permisos seguros.

Use la autenticación de clave pública: https://help.ubuntu.com/community/SSH/OpenSSH/Keys

En el host de origen, ejecute esto solo una vez:

 ssh-keygen -t rsa # ENTER to every field ssh-copy-id myname@somehost 

Eso es todo, después de eso podrás hacer ssh sin contraseña.

Después de buscar una respuesta para la pregunta durante meses, finalmente encuentro la mejor solución: escribir un guión simple.

 #!/usr/bin/expect set timeout 20 set cmd [lrange $argv 1 end] set password [lindex $argv 0] eval spawn $cmd expect "assword:" send "$password\r"; interact 

Ponlo en /usr/bin/exp , luego puedes usar:

  • exp ssh
  • exp scp

¡Hecho!

Podría usar un script de espera. No he escrito uno en bastante tiempo, pero debería verse a continuación. Tendrá que encabezar el script con #! / Usr / bin / expect

 #!/usr/bin/expect -f spawn ssh HOSTNAME expect "login:" send "username\r" expect "Password:" send "password\r" interact 

Variante I

 sshpass -p PASSWORD ssh USER@SERVER 

Variante II

 #!/usr/bin/expect -f spawn ssh USERNAME@SERVER "touch /home/user/ssh_example" expect "assword:" send "PASSWORD\r" interact 
 # create a file that echo's out your password .. you may need to get crazy with escape chars or for extra credit put ASCII in your password... echo "echo YerPasswordhere" > /tmp/1 chmod 777 /tmp/1 # sets some vars for ssh to play nice with something to do with GUI but here we are using it to pass creds. export SSH_ASKPASS="/tmp/1" export DISPLAY=YOURDOINGITWRONG setsid ssh root@owned.com -p 22 

referencia: https://www.linkedin.com/pulse/youre-doing-wrong-ssh-plain-text-credentials-robert-mccurdy?trk=mp-reader-card

sshpass con mejor seguridad

Me tropecé con este hilo mientras buscaba una manera de entrar en un servidor empantanado: me tomó más de un minuto procesar el bash de conexión SSH, y agotó el tiempo de espera antes de poder ingresar una contraseña. En este caso, quería poder proporcionar mi contraseña de inmediato cuando el mensaje estaba disponible.

(Y si no es dolorosamente claro: con un servidor en este estado, es demasiado tarde para configurar un inicio de sesión con clave pública).

sshpass al rescate. Sin embargo, hay mejores formas de sshpass -p que con sshpass -p .

Mi implementación salta directamente a la solicitud de contraseña interactiva (no se pierde tiempo viendo si puede ocurrir el intercambio de claves públicas), y nunca revela la contraseña como texto sin formato.

 #!/bin/sh # preempt-ssh.sh # usage: same arguments that you'd pass to ssh normally echo "You're going to run (with our additions) ssh $@" # Read password interactively and save it to the environment read -s -p "Password to use: " SSHPASS export SSHPASS # have sshpass load the password from the environment, and skip public key auth # all other args come directly from the input sshpass -e ssh -o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no "$@" # clear the exported variable containing the password unset SSHPASS 

sshpass + autossh

Una buena ventaja del ya mencionado sshpass es que puedes usarlo con autossh , eliminando aún más la ineficiencia interactiva.

 sshpass -p mypassword autossh -M0 -t myusername@myserver.mydomain.com 

Esto permitirá la reconexión automática si, por ejemplo, su wifi se interrumpe al cerrar su computadora portátil.

Lo hice funcionar de la siguiente manera

.ssh / config se modificó para eliminar el mensaje sí / no – Estoy detrás de un firewall así que no me preocupan las claves ssh falsificadas

 host * StrictHostKeyChecking no 

Crea un archivo de respuesta para esperar, es decir, answer.expect

 set timeout 20 set node [lindex $argv 0] spawn ssh root@node service hadoop-hdfs-datanode restart expect "*?assword { send "password\r" <- your password here. interact 

Crea tu script bash y solo espera en el archivo

 #!/bin/bash i=1 while [$i -lt 129] # a few nodes here expect answer.expect hadoopslave$i i=[$i + 1] sleep 5 done 

Obtiene 128 nodos de datos de hadoop actualizados con nueva configuración, suponiendo que esté utilizando un assembly NFS para los archivos hadoop / conf

Espero que esto ayude a alguien. ¡Soy un idiota de Windows y me tomó alrededor de 5 horas descubrirlo!

Tengo una mejor solución que incluye el inicio de sesión con su cuenta que cambiar a usuario root. Es un script bash

http://felipeferreira.net/index.php/2011/09/ssh-automatic-login/

La respuesta de @abbotto no funcionó para mí, tenía que hacer algunas cosas de manera diferente:

  1. yum install sshpass cambiado a – rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/sshpass-1.05-1.el6.x86_64.rpm
  2. el comando para usar sshpass ha cambiado a – sshpass -p “pass” ssh user @ mysite -p 2122

Para que el intercambio de claves funcione desde una unidad de almacenamiento, debe copiar su clave privada en la unidad y especificarla en su comando ssh (para evitar el uso de la clave privada de cuentas locales), por ejemplo:

 ssh -i id_rsa host 

Alternativamente, puede usar expect (que es un script separado del shell). Aquí hay una pregunta previa sobre SSH y esperar .

Tenga en cuenta que cualquier persona podrá abrir el script de espera y ver las credenciales de inicio de sesión en texto sin formato.

Para conectar una máquina remota a través de scripts de shell, use el siguiente comando:

 sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no USERNAME@IPADDRESS 

donde IPADDRESS , USERNAME y PASSWORD son valores de entrada que deben proporcionarse en script, o si queremos proporcionar en tiempo de ejecución use el comando “leer”.