miércoles, 6 de abril de 2016

Expect - como integrar un programa interactivo a un script

Expect es una herramienta muy útil para integrar esos programas interactivos, que se ejecutan en una shell, con nuestros o script de administración o páginas web o procesos por lotes.
Una descripción de este seria:

"Expect es un programa que “conversa” con otros programs interativos según un "guión" (o script). Siguiendo el guión, Expect sabe lo que puede esperarse de un programa y cuál debería ser la respuesta correcta. Un lenguaje interpretado proporciona estructuras de ramificación y de control de alto nivel para dirigir el diálogo. Además, el usuario puede tomar el control e interactuar directamente cuando se desea, después de devolver el control al script."

Ejemplo de usos de expect:

  • Se desea automatizar la ejecución de un comando en un servidor Unix o Linux, cuya salida puede variar y se desea analizar.
  • Necesitas repetir la misma configuración en varios switchs que se administran vía ssh. Por ejemplo borrar una vlan.
  • Integrar un viejo menú en una aplicación web.

Para poder comprender su uso, presentare un ejemplo simple de como crear una vlan en varios  switch cisco. La ip del switch es contenido  de un archivo que contiene una lista de ips y se pasa como parámetros el usuario y contraseña común a cada switch.

#!/usr/bin/expect -f
# Al igual que todo script se declara en la primera línea la shell a usar
# en este caso /usr/bin/expect con la opcion -f

# Definicio de variables

# defino la variable f que abre el archivo /home/switch/scripts/listado.txt donde
# están almacenadas las ips de los switch que se configuraran, una ip por línea

set f [open "/home/switch/scripts/listado.txt"]

# defino dos variables basado en los argumentos entregados al script 0 para $1 y 1 para $2 ...
# usuario seria el primer argumento
set usuario [lindex $argv 0]
# passwword seria el segundo argumento
set password [lindex $argv 1]
# en este caso el usuario y contraseña es comun a todos los switch a configurar

# para manejar en mejor forma el contenido del archivo genero una lista usando split y la almaceno
# la variable hosts

set hosts [split [read $f] "\n"]

# cierro el archivo /home/switch/scripts/listado.txt
close $f

# para cada una de las ips genero un bucle
foreach host $hosts {

# ejecuto el comando ssh (spawn, permite ejecutar un comando)
spawn ssh $usuario@$host

# la conexion ssh genera una respuesta, la que generalmente puede ser:
# - Pregunta si se debe aceptar el certificado, si esta es la nueva conexion. Si es este caso
# se espera una linea que termina con "no)?" y se envia (send) la palabra "yes", para indicar
# que se acepta y "\r" para el salto de linea o enter.
# - O pregunta por la contraseña, por lo cual se espera una linea terminada en "assword:"
# el comando expect es el encargado de interpretar la salida del comando anterior
# y segun parametros de busqueda determina la siguiente operacion, para este caso que se envia con send
#
expect {
"no)?" {
send "yes\r"
expect "assword:"
}
"assword:"
}

# se envia la contraseña
send $password\r"

# luego se revisa si se accedio al prompt "#"
expect "#"

# se envia "conf term\r" para ingresar al modo de configuracion del switch
send "conf term\r"

# luego se revisa si se accedio al prompt "#"
expect "#"

# se envia "vlan 96\r" para crear (si no existe) o modificar la vlan 96
send "vlan 96\r"

# luego se revisa si se accedio al prompt "#"
expect "#"

# Se configura el nombre de la vlan a vlan96
send "name vlan96\r"

# luego se revisa si se accedio al prompt "#"
expect "#"

# se envia "end" para termina el modo de configuraci&oacuta;n
send "end\r"

# luego se revisa si se accedio al prompt "#"
expect "#"

# se envia "wr" para grabar la configuraci&oacuta;n
send "wr\r"

# luego se revisa si se accedio al prompt "#"
expect "#"

# se envia "exit" para salidar
send "exit\r"
}

Cada vez que se envia un comando utilizamos "\r" para representar la tecla "Intro" o "Enter"

No hay comentarios.:

Publicar un comentario

Instalación rapida de kvm manager de oracle

 Para instalar kvm manager de oracle se deben seguir los siguientes pasos: Instalar Oracle Linux 7 configurar el fqdn en el archivo /etc/hos...