Expect es una extensión del lenguaje de programación Tcl escrito por Don Libes . El programa automatiza las interacciones con programas que exponen una interfaz de terminal de texto . Expect, escrito originalmente en 1990 para la plataforma Unix , está disponible desde entonces para Microsoft Windows y otros sistemas.
Autor (es) original (es) | Don Libes |
---|---|
Desarrollador (es) | Nils Carlson |
Lanzamiento estable | 5.45.4 / 4 de febrero de 2018 |
Escrito en | C |
Sistema operativo | POSIX , ventanas |
Licencia | Dominio público [1] |
Sitio web | core |
Lo esencial
Expect se utiliza para automatizar el control de aplicaciones interactivas como Telnet , FTP , passwd , fsck , rlogin , tip , SSH y otras. Expect usa pseudo terminales (Unix) o emula una consola (Windows), inicia el programa de destino y luego se comunica con él, tal como lo haría un humano, a través de la interfaz de terminal o consola. Tk , otra extensión de Tcl, se puede utilizar para proporcionar una GUI .
Uso
Expect sirve como un "pegamento" para unir los servicios públicos existentes. La idea general es averiguar cómo hacer que Expect utilice las herramientas existentes del sistema en lugar de averiguar cómo resolver un problema dentro de Expect.
Un uso clave de Expect involucra productos de software comerciales. Muchos de estos productos proporcionan algún tipo de interfaz de línea de comandos, pero por lo general carecen de la potencia necesaria para escribir scripts . Fueron construidos para dar servicio a los usuarios que administran el producto, pero la empresa a menudo no gasta los recursos para implementar completamente un lenguaje de scripting robusto. Un script Expect puede generar un shell, buscar variables ambientales, ejecutar algunos comandos Unix para recuperar más información y luego ingresar a la interfaz de línea de comandos del producto armado con la información necesaria para lograr el objetivo del usuario. Después de recuperar información al interactuar con el producto a través de su interfaz de línea de comandos, el script puede tomar decisiones inteligentes sobre qué acción tomar, si corresponde.
Cada vez que se completa una operación Expect, los resultados se almacenan en una variable local llamada $ espera_out. Esto permite que el script recopile información para retroalimentar al usuario y también permite un comportamiento condicional de qué enviar a continuación en función de las circunstancias.
Un uso común de Expect es configurar un conjunto de pruebas, ya sea para programas, utilidades o sistemas integrados. DejaGnu es un conjunto de pruebas escrito con Expect para su uso en pruebas. Se ha utilizado ampliamente para probar GCC y es muy [ cita requerida ] muy adecuado para probar objetivos remotos como el desarrollo integrado.
Se puede automatizar la generación de un script de Expect usando una herramienta llamada 'autoexpect'. Esta herramienta observa sus acciones y genera un script Expect usando heurísticas. Aunque el código generado puede ser grande y algo críptico, siempre se puede modificar el script generado para obtener el código exacto.
# Suponga que $ servidor_remoto, $ my_user_id, $ my_password y # $ my_command se leyeron anteriormente en el script.# Abra una sesión Telnet a un servidor remoto y espere # hasta que se le solicite el nombre de usuario. spawn telnet $ servidor_remoto espera "nombre de usuario:"# Envíe el nombre de usuario y luego espere a que se le solicite la contraseña. enviar "$ my_user_id \ r" esperar "contraseña:"# Envíe la contraseña y luego espere un indicador de shell. enviar "$ my_password \ r" esperar "%"# Envíe el comando precompilado y luego # espere otro indicador de shell. enviar "$ my_command \ r" esperar "%"# Capture los resultados del comando en una variable. Este # se puede mostrar o escribir en el disco. establecer resultados $ espera_salida ( búfer )# Salga de la sesión Telnet y espere un carácter especial # de fin de archivo. enviar "salida \ r" esperar eof
Otro ejemplo es un script que automatiza FTP:
# Establezca el parámetro de tiempo de espera en un valor adecuado. # Por ejemplo, el tamaño del archivo es realmente grande y la # velocidad de la red es realmente un problema, es mejor que establezcas un valor # para este parámetro. establecer tiempo de espera - 1# Abra una sesión FTP en un servidor remoto y # espere a que se le solicite el nombre de usuario. spawn ftp $ servidor_remoto espera "nombre de usuario:"# Envíe el nombre de usuario y luego espere a que se le solicite la contraseña. enviar "$ my_user_id \ r" esperar "contraseña:"# Envíe la contraseña y luego espere el mensaje 'ftp'. enviar "$ my_password \ r" esperar "ftp>"# Cambie al modo binario y luego espere el mensaje 'ftp'. enviar "bin \ r" esperar "ftp>"# Desactive las indicaciones. enviar "prompt \ r" esperar "ftp>"# Obtener todos los archivos enviar "mget * \ r" esperar "ftp>"# Salga de la sesión FTP y espere un carácter especial # de fin de archivo. enviar "bye \ r" esperar eof
A continuación se muestra un ejemplo que automatiza SFTP (con una contraseña):
#! / usr / bin / env espera -f# Procedimiento para intentar conectarse; resultado 0 si está bien, 1 de lo contrario proc connect { contraseña } { espera { "Contraseña:" { enviar "$ contraseña \ r" espera { "sftp *" { return 0 } } } } # Tiempo de espera agotado regresar 1 }# Leer los parámetros de entrada establecido usuario [ lindex $ argv 0 ] conjunto passw [ lindex $ argv 1 ] conjunto anfitrión [ lindex $ argv 2 ] conjunto ubicación [ lindex $ argv 3 ] conjunto archivo1 [ lindex $ argv 4 ] conjunto fichero2 [ lindex $ argv 5 ]#puts "Datos del argumento: \ n"; #puts "usuario: $ usuario"; # introduce "contraseña: $ contraseña"; #puts "host: $ host"; #puts "ubicación: $ ubicación"; #puts "archivo1: $ archivo1"; #puts "archivo2: $ archivo2";# Compruebe si se proporcionaron todos si { $ user == "" || $ contraseña == "" || $ host == "" || $ ubicación == "" || $ file1 == "" || $ file2 == "" } { pone "Uso: \ n" exit 1 }# Sftp al host especificado y enviar los archivos spawn sftp $ user @ $ hostestablecer rez [ conectar $ contraseña ] si { $ rez == 0 } { enviar "cd $ ubicación \ r" establecer tiempo de espera - 1 enviar "poner $ archivo2 \ r" enviar "poner $ archivo1 \ r" enviar "ls -l \ r " enviar " salir \ r " esperar eof salir 0 } pone " \ nError al conectarse al servidor: $ host, usuario: $ usuario y contraseña: $ contraseña! \ n " salir 1
El uso de contraseñas como argumentos de línea de comandos, como en este ejemplo, es un enorme agujero de seguridad, ya que cualquier otro usuario de la máquina puede leer esta contraseña ejecutando " ps ". Sin embargo, puede agregar un código que le solicite su contraseña en lugar de dar su contraseña como argumento. Esto debería ser más seguro. Vea el ejemplo a continuación.
stty - echo send_user - "Ingresar contraseña:" espera_usuario - re "(. *) \ n" send_user "\ n" stty echo set PASS $ espera_salida ( 1 , cadena )
Otro ejemplo de inicio de sesión SSH automatizado en una máquina de usuario:
# El tiempo de espera es una variable predefinida en Expect que, # por defecto, se establece en 10 segundos. # spawn_id es otra variable predefinida en Expect. # Es una buena práctica cerrar el identificador spawn_id # creado por el comando spawn. establece el tiempo de espera 60 spawn ssh $ user @ machine mientras { 1 } { espera { eof {break} "La autenticidad del host" { enviar "sí \ r" } "contraseña:" { enviar "$ contraseña \ r" } "* \]" { enviar "salir \ r" } } } esperar cerrar $ spawn_id
Alternativas
Varios proyectos implementan funciones similares a las de Expect en otros lenguajes, como C # , Java , Scala , Groovy , Perl , Python , Ruby , Shell y Go . Por lo general, estos no son clones exactos del Expect original, pero los conceptos tienden a ser muy similares.
C#
- Expect.NET : funcionalidad esperada para C # (.NET)
- DotNetExpect : una biblioteca de automatización de consola inspirada en Expect para .NET
Java
- ExpectIt : una implementación pura de Java 1.6+ de la herramienta Expect. Está diseñado para ser simple, fácil de usar y extensible.
- esperar4j - un intento de un clon Java del Expect original
- ExpectJ : una implementación de Java de la utilidad de espera de Unix
- Expect-for-Java : implementación pura de Java de la herramienta Expect
- esperar4java : una implementación de Java de la herramienta Expect, pero admite cierres anidados. También hay un contenedor para el DSL del lenguaje Groovy.
Scala
- scala-wait : una implementación de Scala de un subconjunto muy pequeño de la herramienta Expect.
Groovy
- wait4groovy : una implementación Groovy DSL de la herramienta Expect.
Perl
- Expect.pm - Módulo Perl (versión más reciente en metacpan.org )
Pitón
- Pexpect : módulo de Python para controlar programas interactivos en una pseudo-terminal
- winpexpect - puerto de pexpect a la plataforma Windows
- paramiko-wait : una extensión similar a la de Python para la biblioteca SSH de Paramiko que también admite registros de cola.
Rubí
- RExpect : un reemplazo directo para el módulo espera.rb en la biblioteca estándar.
- Expect4r : interactuar con Cisco IOS, IOS-XR y Juniper JUNOS CLI
Cáscara
- Vacío : utilidad similar a la de esperar para ejecutar comandos interactivos en los scripts de shell de Unix
- sexpect - Espere conchas. Está implementado en el modelo cliente / servidor que también admite adjuntar / desconectar (como la pantalla GNU ).
Ir
- GoExpect : paquete similar a Expect para el idioma Go
- go-wait : una biblioteca de idiomas Go similar a Expect para automatizar el control de programas basados en terminales o consolas.
Oxido
- rexpect - paquete similar a pexpect para el lenguaje Rust.
Erlang
- lux : marco de automatización de pruebas con comandos de ejecución de estilo Expect.
Referencias
- ^ "Preguntas frecuentes sobre Expect: la política de nuestra empresa requiere una licencia para usar Expect. ¿Dónde podemos obtener una licencia?" . 2006-10-11.
Otras lecturas
- Libes, Don (1995). Explorando Expect: una herramienta basada en Tcl para automatizar programas interactivos . O'Reilly Media . ISBN 1-565-92090-2.
- Fisher, David (1999). "Programación avanzada en espera: una interfaz a prueba de balas" . No. 48. Gaceta de Linux . La revista Cite requiere
|magazine=
( ayuda )
enlaces externos
- Página web oficial
- Espere en SourceForge.net
- Cuándo usar Expect scripting y cuándo evitarlo en Wayback Machine (archivado 2017-10-25) (IBM Developerworks)