Muchas veces nos toca hacer tareas repetitivas una y otra vez que nos quitan mucho tiempo. Normalmente no las damos la mayor importancia, ya que estamos acostumbrados a hacerlas y nos salen casi sin pensar. Desde un simple ssh o una copia de backup, hasta un despliegue de la aplicación a producción.
Este tipo de tarea son subceptibles a fallos, ya que estamos tan habituados a ellas, que las hacemos sin pensar. ¿Cuántas veces has cometido fallos al hacerlas? ¿cuántas veces has puesto mal el nombre de la máquina a la que te vas a conectar, has metido mal la password, o incluso hasta te has cargado algo por un error tonto? Yo multitud de ellas.
Una de las mejores cosas que tiene la informática, es que podemos automatizar las tareas para ahorrarnos un tiempo valiosísimo y evitar esta serie de errores tontos, pero que pueden ser garrafales.
Hoy voy a intentan enseñaros una herramienta simple para automatizar estas tareas, llamada Expect.
Me diréis, “¿por qué nos cuentas esto? create un programa en bash o en cualquier lenguaje y ala!” Pero hay muchas veces que tenemos que pegarnos contra una interfaz interactiva, a la cual tenemos que contestar y esperar a que nos conteste, por eso solemos hacer estas tareas a mano. Bien, pues con Expect podemos interactuar con la terminal de turno y de una manera realmente fácil
Expect es una herramienta basada en el lenguaje Tcl, utilizada para automatizar aplicaciones interactivas como ssh, telnet, scp, ftp, etc, y todo esto de una manera rápida y sencilla.
Bien, pues empecemos con un ejemplo de una simple conexión por ssh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #!/usr/bin/expect -f ######################## # Desactivamos el timeout set timeout -1 ## Definimos variables de la conexion set server dns_o_IP set port 22 # Por defecto el 22 set user usuario_para_la_conexion set pass password_del_usuario ##################################### ## Inicio Script ##################################### ## Sacamos un mensaje al usuario send_user "Conectando a $server\n" ## Lanzamos un proceso que podemos controlar spawn ssh $user@$server -p $port ## Una especie de switch-case para controlar ## lo que devuelve el comando expect { -re ".*Are.*.*yes.*no.*" { ## Lo esperado como expresion regular. send "yes\r" ## Si se cumple lo anterior pasamos a la terminar “yes\r” exp_continue ## Continua con el siguiente resultado al comando expect } "assword: " { ## Al ver que nos pide la password send "$pass\r" ## se la pasamos } } send_user "\nConectado a $server\n" ## Le decimos al script que pase el control al usuario ## para que el continue utilizando la terminal interact |
Yo concretamente uso este tipo de script para conectarme a mis máquinas en el trabajo, y nunca me equivoco en la ip ni en el usuario ni en el password
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ####################################### ## Creando tar ###################################### ## Definimos variables set dirToBackup directorio_para_backup set tarFile /tmp/backup.tgz set tarCommand /bin/tar send_user "\nCreando tar de $server:$dirToBackup...\n" ## Lanzamos el comando send -- "$tarCommand zcvf $tarFile $dirToBackup\n" expect { ## Este expect espera a que termine el comando y “> “ {} ## salgamos a la shell, vale para shells que terminan “$ “ {} ## por > y $ } send_user "\nTar Generado.\n" exit |
Y a continuación por ejemplo podemos copiarlo a local:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | ######################################## ## Cerrando conexion con el servidor ####################################### send -- "exit\n" expect { "> " { } "$ " { } } send_user "Salimos del servidor\n" ######################################## ## Copiamos backup a local ######################################## set scpCommand /usr/bin/scp send_user "Copiando tar...=> $tarFile \n" ## Lanzamos el comando de copia remota scp spawn $scpCommand $user@$server:$tarFile . expect { “> ” { } “$ ” { } } send_user “Fin.\n” exit |
Imaginaros que cantidad de cosas podemos automatizar de una forma sencillita y cuanto tiempo y errores podemos ahorrarnos. Ahora piensa que cosas repites una y otra vez de forma repetitiva todos los días y podrías automatizar…. y hazlo!!
pablo says:
Expect!!!!!!!!! En 2001 tuve que usarlo en Sony para automatizar pruebas… y me pareció una condena… “yo he venido aquí a programar, no a usar esta #@#a!!” pensaba!!
¿Habría desarrollado pnunit (http://www.plasticscm.com/infocenter/technical-articles/pnunit.aspx) de haber llegado a dominar expect??
jul 18, 2011, 19:55Alvaro Garcia Loaisa says:
Me da, que o no te has leído el principio del post o no te has enterado bien Pablo
Está claro que para realizar pruebas automáticas en desarrollos utilizar Expect es de idiotas, para eso tenemos XUnit y otros 100 frameworks más como el tuyo, basados o no en Xunit. Yo me refiero a automatizar tareas repetitivas dentro del ambiente del entorno, no en el desarrollo de una aplicación. Aún así estoy seguro de que hay mil herramientas mejores que esta, solo que esta es la que utilizo para hacer cosillas simples como pone en la entrada y hago un script en 5 minutos, con lo que para ello me resulta perfecta
Lo realmente importante de la entrada son los primeros 3 párrafos, es decir, automatiza todo lo que puedas, con las herramientas que quieras
Salu2!
jul 18, 2011, 7:55