miércoles, 12 de diciembre de 2007

Conectar a través de ssh sin password con expect

Fuente: LinuTeca

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.

3 comentarios:

Anónimo dijo...

No he podido hacer que el codigo funcione....por favor si se puede explicar algo sobre el codigo...las variables que reciben los datos parece que no funcionan como deberia...porque cuando ejecuto el codigo por ej me sale:
spawn ssh @192.168.0.83, creo que deberia ser:
spawn ssh usuario@192.168.0.83
Pero si se puede explicar algo lo agradeceria mucho par ver si puedo corregir lo que tengo mal...

Saludos...

Anónimo dijo...

Otra vez yo..Anonimo..estuve corriendo el programa una y otra vez buscando los posibles errores y con unas modificaciones logre hacer que se conectara al pc que queria para ello tuve que aumentar los tiempos sleep y colocarle otros antes de que pidiera la clave...

Pero aun sigo esperando la ayuda....

Saludos...me voy a dormir mejor..

pcatalina dijo...

Si te pide lo de yes/no para la clave pública, despues no manda el password.

Alguna solución?

Vamos que el script no funciona.