Automatiza todo lo que puedas con Expect

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 :D

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

 

Bueno, como veis es bastante sencillito, no hace falta controlar mucho del lenguaje para manejar este tipo de scripts. Ahora simplemente modificando las variables tenéis un script que se conecta por ssh a la máquina que le digáis, de una manera muy rápida. Hasta podéis configurar el prompt sin necesidad de modificarlo en el .bashrc del servidor.
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 ;)

 

Ahora, podemos comprimir un directorio del que queramos hacer un backup (por ejemplo) una vez conectados a él con el script anterior y quitando el comando interact:

 

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

 

Para más ayuda, tenemos el comando autoexpect. Este comando graba todo lo que hagamos en una terminal y lo va guardando en un archivo en formato expect, y una vez hayamos terminado podemos ejecutarlo. Esto, repetirá fiel y exactamente los mismo pasos que habíamos hecho. Esto ya es el colmo! :D

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!! ;)

 
 


2 responses so far, want to say something?

  1. 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?? :P

  2. Alvaro Garcia Loaisa says:

    Me da, que o no te has leído el principio del post o no te has enterado bien Pablo :P

    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!

Deja un comentario

IMG_4939IMG_4206IMG_4462IMG_4961IMG_4484IMG_4491IMG_4500IMG_3869IMG_4507IMG_3936IMG_4622IMG_4358IMG_4765IMG_4494
%d personas les gusta esto: