Conectar a través de ssh sin password con expect

Publicado el 9 de Diciembre ,2007 por ekhtor

El comando expect surgió para controlar de forma automática aplicaciones interactivas que requerían una o varias entradas por parte del usuario por teclado y hacían lentas las ejecuciones o pruebas. El caso que expongo a continuación es el de la conexión a través de ssh que al introducir el comando, nos pide el password, y a no ser que hayamos hecho un intercambio de claves públicas, es bastante molesto introducirlo en cada conexión. Para no perder el tiempo, qué mejor que un script con el comando expect.

Expect básicamente consiste en ponerse a la escucha de los comandos que salen por pantalla y cuando captura uno que sigue un patrón establecido por el usuario ejecuta un comando o manda un mensaje al programa. En nuestro caso expect estará a la espera de que aparezca en pantalla el patrón “assword: ” (sin la p, porque en unos sistemas es en mayúsculas y en otros en minúsculas), y cuando eso ocurra mandaremos el mensaje al programa con nuestro password más un ’salto de línea’.

Con esto ya estremos dentro del sistema y podremos ejecutar los comandos que queramos.

Como última anotación antes de poner el ejemplo, solo decir, que para que funcione este comando hay que instalar el paquete expect en algunas distribuciones como Ubuntu:

sudo apt-get install expect

Aquí os dejo un script ejemplo de conexión por ssh y ejecución de comandos:

#!/usr/bin/expect -fset timeout 30
#ejemplo de como pasar parametros al ejecutarlo
set server [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
send_user "Conectando con $server\n"
spawn ssh $user@$server
#Conectamos en estos casos:
#   login con las claves RSA (sin user/pass)
#   login con user/pass
#   login con user/pass (con la verificacion de las claves RSA)
expect {
"> " { }
"$ " { }
"assword: " {
send "$pass\n"
expect {
"> " { }
"$ " { }
}
}
"(yes/no)? " {
send "yes\n"
expect {
"> " { }
"$ " { }
}
}
default {
send_user "Falló el login\n"
exit
}
}
#ejemplo de ejecucion del comando ls
send "ls\n"
sleep 3
expect {
"> " {}
default {}
}
#Salir
send "exit\n"
expect {
"> " {}
default {}
}
send_user "Finalizado\n"

A primera vista puede parecer complicado el cógido pero realmente es muy simple, usamos el comando spawn para poner a la escucha un programa, el comando expect para hacer un acción cuando el programa escribe en pantalla, y el comando send para devolver la cadena deseada.

Para más información sobre el comando expect en la sección de manuales encontraréis los necesario.

Entradas Relaccionadas

  1. Una Respuesta to “Conectar a través de ssh sin password con expect”

  2. Por Martin el 23 Abr, 2008 | Responder

    buenas!!!

    tengo una pregunta…;

    como podria hacer para que el comando ’send_user’ me mande el mensaje a una cuenta de correo electronico, si es que se puede.

    mandame un mail asi se que me respondistes.

    saludos!!

    pd: silvero.martin@gmail.com

Publica un comentario

Comenta