Expect, automatizando aplicaciones interactivas

Una vez que te dedicas a administrar servicios y servidores, te topas con algunas cosas que difícilmente se pueden automatizar sin un conocimiento previo, por ejemplo, manejar un servicio ftp, en donde constantemente actualizas los mismos archivos y les aplicas propiedades especiales, o cuando configuras routers o switchs.

En mi caso debía hacer un script que me automatizara la habilitación de una interfaz en un switch a una hora determinada y luego la desactivara a otra hora. La programación de la hora no es problema, ya que solamente se debe configurar con el crontab 🙂

Así que me sumergí en la idea de crear un script con bash para realizar esta tarea, pero al poco tiempo me di cuenta de que no era la solución, pues no podía especificar como hacer esa tarea llamando a la conexión por telnet y luego por medio de tuberías mandarle los pasos a seguir.

Luego de buscar en google, me encontré con expect, que es un herramienta para automatizar aplicaciones interactivas, como telnet, ftp, ssh, etc. incluso el propio bash!! y todo por medio de scripts 🙂 Expect es una aplicación basada en el famoso lenguaje TCL (Tool Comand Language), recomendable para tener en la lista de lenguajes para aprender.

Luego de una rápida inspección a un tutorial de expect, y una vista a la gran cantidad de ejemplos que hay en la misma página de expect, muy bien explicados, y la lista de scripts de la comunidad, pude crear un script que automatizara toda la tarea 🙂 así que por ese medio lo comparto 🙂

#!/usr/bin/expect --
# Script para activar y desactivar interfaces
if$argc<2 {
   send_user "Modo de uso\n"
   send_user "$argv0 Num_interface estado \n"
   send_user "   "
exit
}
set PASS $expect_out(0,string)
set IFACE [lindex $argv 0]
set ESTADO [lindex $argv 1]
log_user 0 
spawn telnet 10.0.0.1
expect "Username :"
send "usuario\r"
expect "Password :"
send "contraseña\r"
expect "=>"
log_user 1 
send "eth device ifconfig intf=ethif$IFACE type=auto state=$ESTADO\r"
expect "=>"
send "exit\r"
send_user "\nSaliendo...\n"
exit

Etiquetas: , , ,

8 responses to “Expect, automatizando aplicaciones interactivas”

  1. Element2048 says :

    ¡Hola!

    Sin duda muy útil no lo conocía quiero hacer pruebas con el ¡gracias Dhabyx! excelente tip 😉

  2. dhabyx says :

    @Element: hay tanto que conocer; y sin saber de la existencia de expect, slack ya lo trae por defecto 🙂

  3. Martin says :

    Buenas!!!

    tengo una pregunta para ver si me podes ayudar.

    con el comando ´send_user´; como logro que me mande el mensaje a una cuenta de correo electronico??

    gracoias!!!!

    pd: mandame un mail asi se que respondistes: silvero.martin@gmail.com

  4. dhabyx says :

    @Martin: necesitas utilizar algún otro comando o script para hacer eso, puedes usar por ejemplo usar sendmail o mailto.

    Saludos!!

  5. JOSE says :

    Con Linux, no consigo encontrar los paquetes para instalar las funciones spawn y send.

    Podríais decirme funciones similares para hacer este script.

  6. dhabyx says :

    @JOSE: al parecer estas usando un script de bash, este no es un script para bash si no para expect.

    asegúrate de que le hayas colocado al inicio del script
    #!/usr/bin/expect —

    de lo contrario cuando lo ejecutes usara bash en vez de expect.

  7. MAURICIO MARTINEZ GARCIA says :

    Que paso amigo dhabyx hace mucho que no charlamos en el irc, estaba buscando info de este programa y me tope con tu web.

    Por cierto, no hay problema con passwords que usan caracteres reservados en linux (ejemplo $), o es lo mismo de siempre con escaparlo es suficiente?

    saludos.

    • dhabyx says :

      Ya hace ratos que no me pasaba por este blog, pero si hay que tener cuidado con caracteres especiales; yo le hice una modificación para que lo pidiese a la consola o a veces se lo paso como parámetro.

Replica a dhabyx Cancelar la respuesta