Linux en Español

Comando Expect automatizar scripts de shell como si fuera magia

En la publicación anterior, hablamos acerca de escribir scripts practicos de shell  y además pudimos observar que tan fácil es escribir un script de shell. Hoy vamos a hablar acerca de una herramienta les da magia a nuestros scripts de shell. Esa herramienta es el comando Expect o el lenguaje de scripting Expect.

Esta herramienta mencionada anteriormente es un lenguaje que habla con tus programas interactivos o scripts que requieran una interacción con el usuario.


El lenguaje de scripting Expect funciona al esperar una entrada, luego el script Expect enviara una respuesta sin ninguna interacción del usuario.

En conclusión, podemos decir que herramienta es tu robot que automatizará tus scripts.

Si el comando Expect no está instalado en tu sistema, puedes instalarlo utilizando el siguiente comando:

$ apt-get install expect

O en sistemas basados en Red Hat como CentOS:

$ yum install expect

 

 

Comando Expect

Antes de que hablemos del comando expect, vamos a ver algunas sentencias del comando expect:

spawn                  Iniciar un script o un programa.

expect                  Esperar la salida de un programa.

send                      Enviar una respuesta a tu programa.

interact                Permitirte interactuar con tu programa.

  • El comando spawn es utilizado para iniciar un script o un programa como el shell, FTP, Telnet, SSH, SCP, entre otros.
  • El comando send es utilizado para enviar una respuesta a un script o un programa.
  • El comando Expect espera por una entrada.
  • The interact command allows you to define a predefined user interaction.

Vamos a escribir un script de shell que haga algunas preguntas y nosotros haremos un script Expect que responda a esas preguntas.

Primero, el script de shell se verá como algo así:

Now we will write the Expect scripts that will answer this automatically:

La primera línea define la ruta del comando expect el cual es #!/usr/bin/expect .

En la segunda línea de código, deshabilitamos el timeout. Luego iniciamos nuestro script utilizando el comando spawn.

Podemos utilizar el comando spawn para ejecutar cualquier programa que queramos o cualquier otro script interactivo.

Las líneas restantes son el script Expect que interactúa con nuestro script de shell.

La última línea es el fin de archivo lo cual significa que es el final de la interacción.

Ahora comencemos. Vamos a ejecutar nuestro bot de respuesta y asegúrate que este sea ejecutable.

$ chmod +x ./answerbot

$./answerbot

expect command

¡¡Genial!! Todas las preguntas fueron respondidas de la forma en que lo esperábamos.

Si obtienes errores acerca de la localización del comando Expect puedes utilizar el comando wich para encontrar la ruta exacta:

$ which expect

Nosotros no interactuamos con el script en ningún momento, el programa Expect hizo el trabajo por nosotros.

El método anterior puede ser aplicado a cualquier script interactivo o programa. Sin embargo, aunque el script Expect mostrado anteriormente es muy fácil de escribir, tal vez este tipo de scripts se les dificulten a algunas personas. Bueno eso es todo aquí lo tienes.

Utilizando autoexpect

Para construir un script expect automáticamente, puedes utilizar el comando autoexpect.

autoexpect funciona como expect, pero construye el script de automatización por ti. El script que quieres automatizar es pasado a autoexpect como parámetro y las respuestas a tus preguntas son guardadas en un archivo.

$ autoexpect ./questions

autoexpect command

Un archivo generado llamado script.exp contiene el mismo código que hicimos arriba con algunas adiciones que no modificaremos por ahora.

autoexpect script

Si ejecutas el archive autogenerado script.exp, vas a ver las mismas respuestas como se esperaba:

autoexpect script execution

¡¡Genial!! Esto es súper fácil.

Hay muchos comandos que producen una salida modificable, como es el caso de programas FTP, el script expect puede fallar o colgarse. Para resolver este problema, puedes utilizar comodines para los datos modificables, dándole así más flexibilidad a tu script.

 



Trabajando con Variables

El comando set es utilizado para definir variables en scripts Expect de la siguiente forma:

set MYVAR 5

Para acceder a la variable, escribe el carácter $ antes del nombre de la variable así: $VAR1

Para definir argumentos de la línea de comando en scripts Expect, vamos a utilizar la siguiente sintaxis:

set MYVAR [lindex $argv 0]

Aquí definimos la variable MYVAR la cual es igual al primer argumento pasado.

Además, puedes obtener el primer y segundo argumento y guardarlos en variables de esta forma:

Vamos a añadir variables a nuestro script:

Ahora vamos a intentar ejecutar el script Expect con algunos parámetros para ver la salida::

$ ./answerbot SomeName Programming

expect command variables

¡¡Increíble!! Ahora nuestro script automatizando Expect es más dinámico.

 


Pruebas Condicionales

Puedes escribir pruebas condicionales utilizando llaves de la siguiente forma:

Vamos a cambiar nuestro script para retornar condiciones diferentes. Y cambiaremos nuestro script Expect para que maneje esas condiciones.

Vamos a emular diferentes expects con el siguiente script:

Un numero aleatorio es generado siempre que ejecutas el script y con base en ese número vamos a colocar una condición para retornar diferentes expects.

Vamos a realizar el script expect que maneje esto.

expect command conditions

Si el script llega a la salida con topic, el script Expect enviara programación y si el script llega a la salida con movie enviara star wars. ¿Genial, cierto?

 

Condiciones If else

Puedes utilizar la cláusula if/else en scripts expect de la siguiente forma:

expect command if command

Nota: La llave de abertura debe estar siempre en la misma línea.

 


Ciclos While

Los ciclos While en el lenguaje expect debe utilizar llaves para que contenga la expresión así:

expect command while loop

 


Ciclos For

Para realizar un ciclo for en expect, tres campos deben ser especificados con el siguiente formato:

expect command for loop

 

Funciones Definidas por el Usuario

Puedes definir una función utilizando proc como se muestra a continuación:

Y luego puedes utilizarlas.

expect command user-defined functions

 

Comando Interact

A veces tu script Expect contiene información que no quieres compartir con otros usuarios que utilicen tus scripts, como contraseñas u otros datos, así que si quieres que tu script reciba esta contraseña como entrada y luego continúe su automatización normalmente.

El comando interact revierte el control de nuevo al teclado.

Cuando este comando es ejecutado, Expect empezara a leer información ingresada desde el teclado.

Este script de shell te solicitara una contraseña como se muestra:

Ahora vamos a escribir un script Expect que muestre un mensaje para recibir la contraseña:

interact command

Luego que escribes la contraseña, teclea ++ y el control regresara al script.

El lenguaje Expect se ha realizado en muchos lenguajes como C#, Java, Perl, Python, Ruby y Shell con casi los mismos conceptos y sintaxis debido a su simplicidad e importancia.

El lenguaje de scripting Expect es utilizado para el aseguramiento de calidad, mediciones de red como hacer un echo de un tiempo de respuesta, automatización de archivos, actualizaciones y muchos otros usos.

Espero que ahora estés supercargado con algunos de los aspectos más importantes del comando Expect, el autoexpect y cómo utilizarlos para automatizar tus tareas de una manera inteligente.

Gracias.

Mokhtar Ebrahim
Estoy trabajando como administrador de sistemas Linux desde 2010. Soy responsable de mantener, proteger y solucionar problemas de servidores Linux para múltiples clientes de todo el mundo. Me encanta escribir guiones de shell y Python para automatizar mi trabajo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *