Esperar

Extensión del lenguaje de scripting Tcl
Esperar
Autor(es) original(es)Don Libés
Desarrollador(es)Nils Carlson
Versión estable
5.45.4 / 4 de febrero de 2018 ; hace 6 años ( 04-02-2018 )
Escrito endo
Sistema operativoPOSIX , ventanas
LicenciaDominio público [1]
Sitio webcore.tcl-lang.org/esperar/

Expect es una extensión del lenguaje de programación Tcl escrita por Don Libes . [2] El programa automatiza las interacciones con programas que exponen una interfaz de terminal de texto . Expect, escrito originalmente en 1990 para la plataforma Unix , desde entonces está disponible para Microsoft Windows y otros sistemas.

Lo esencial

Expect se utiliza para automatizar el control de aplicaciones interactivas como Telnet , FTP , passwd , fsck , rlogin , tip , SSH y otras. [3] Expect utiliza pseudoterminales (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. [4] Tk , otra extensión de Tcl, se puede utilizar para proporcionar una GUI . [5]

Uso

Expect funciona como un "pegamento" para unir las utilidades existentes. La idea general es descubrir cómo hacer que Expect utilice las herramientas existentes del sistema en lugar de descubrir 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 generalmente carecen de la potencia necesaria para escribir scripts . Fueron creados para dar servicio a los usuarios que administran el producto, pero la empresa a menudo no gasta los recursos necesarios para implementar completamente un lenguaje de scripts robusto. Un script de 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 interactuando 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 $expect_out. Esto permite que el script recopile información para enviarla al usuario y también permite un comportamiento condicional sobre qué enviar a continuación según las circunstancias.

Un uso común de Expect es configurar un conjunto de pruebas para programas, utilidades o sistemas integrados. DejaGnu es un conjunto de pruebas escrito con Expect para su uso en pruebas. Se ha utilizado para probar GCC y objetivos remotos como el desarrollo integrado.

El script Expect se puede automatizar con una herramienta llamada "autoexpect". Esta herramienta observa tus acciones y genera un script Expect mediante heurística. Aunque el código generado puede ser extenso y algo críptico, siempre se puede modificar el script generado para obtener el código exacto.

# Supongamos que $remote_server, $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 # a que le soliciten el nombre de usuario. spawn  telnet $remote_server expect "username:"  # Envíe el nombre de usuario y luego espere la solicitud de contraseña. send "$my_user_id\r" expect "password:"  # Envíe la contraseña y luego espere el mensaje de shell. send "$my_password\r" expect "%"  # Envíe el comando prediseñado y luego espere # otro mensaje de shell. send "$my_command\r" expect "%"  # Captura los resultados del comando en una variable. Esto se puede mostrar o escribir en el disco. set  results $expect_out ( buffer ) # Salga de la sesión Telnet y espere un carácter especial de fin de archivo. send "exit\r" expect eof  

Otro ejemplo es un script que automatiza el FTP:

# Establezca el parámetro de tiempo de espera en un valor adecuado. # Por ejemplo, si el tamaño del archivo es realmente grande y la velocidad de la red es realmente un problema, es mejor que establezca un valor para este parámetro. set  timeout - 1 # Abra una sesión FTP a un servidor remoto y # espere el mensaje de nombre de usuario. spawn  ftp $remote_server expect "username:"  # Envíe el nombre de usuario y luego espere la solicitud de contraseña. send "$my_user_id\r" expect "password:"  # Envíe la contraseña y luego espere el mensaje 'ftp'. send "$my_password\r" expect "ftp>"  # Cambie al modo binario y espere el mensaje 'ftp'. send "bin\r" expect "ftp>"  # Desactivar el aviso. send "prompt\r" expect "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. send "bye\r" expect eof  

A continuación se muestra un ejemplo que automatiza SFTP (con contraseña):

#!/usr/bin/env espera -f# Procedimiento para intentar la conexión; resultado 0 si es correcto, 1 en caso contrario proc  connect { passw } { expect { "Contraseña:" { send "$passw\r" expect { "sftp*" { return 0 } } } } # Tiempo de espera agotado return 1 }                     # Leer los parámetros de entrada establecer  usuario [ lindex $argv 0 ] establecer contraseña [ lindex $argv 1 ] establecer host [ lindex $argv 2 ] establecer ubicación [ lindex $argv 3 ] establecer archivo1 [ lindex $argv 4 ] establecer archivo2 [ lindex $argv 5 ]                       #pone "Datos del argumento:\n"; #pone "usuario: $usuario"; #pone "contraseña: $contraseña"; #pone "host: $host"; #pone "ubicación: $ubicación"; #pone "archivo1: $archivo1"; #pone "archivo2: $archivo2";# Verificar si se proporcionaron todos if { $user == "" || $passw == "" || $host == "" || $location == "" || $file1 == "" || $file2 == "" } { puts "Uso: <usuario> <contraseña> <host> <ubicación> <archivo1 a enviar> <archivo2 a enviar>\n" exit 1 }                              # SFTP al host especificado y envía los archivos spawn  sftp $user @ $host establecer  rez [ conectar $passw ] si { $rez == 0 } { enviar "cd $location\r" establecer tiempo de espera - 1 enviar "poner $file2\r" enviar "poner $file1\r" enviar "ls -l\r" enviar "salir\r" esperar eof salir 0 } pone "\nError al conectar al servidor: $host, usuario: $user y contraseña: $passw!\n" salir 1                           

El uso de contraseñas como argumentos de línea de comandos, como en este ejemplo, es un gran agujero de seguridad, ya que cualquier otro usuario de la máquina puede leer esta contraseña ejecutando " ps ". Sin embargo, puede agregar código que le solicite su contraseña en lugar de proporcionarla como argumento. Esto debería ser más seguro. Vea el ejemplo a continuación.

stty - echo send_user -- "Ingrese la contraseña: " expect_user - re "(.*)\n" send_user "\n" stty echo set PASS $expect_out ( 1 ,string )         

Otro ejemplo de inicio de sesión SSH automatizado en una máquina de usuario:

# Timeout 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. set  timeout 60 spawn ssh $user @machine while { 1 } { expect {        eof {break} "La autenticidad del host" { send "yes\r" } "contraseña:" { send "$password\r" } "*\]" { send "exit\r" } } } esperar cerrar $spawn_id            

Alternativas

Varios proyectos implementan funciones similares a Expect en otros lenguajes, como C# , Java , Scala , Groovy , Perl , Python , Ruby , Shell y Go . Por lo general, no son clones exactos del Expect original, pero los conceptos tienden a ser muy similares.

DO#

  • Expect.NET: funcionalidad Expect para C# (.NET)
  • DotNetExpect: una biblioteca de automatización de consola inspirada en Expect para .NET

Erlang

  • lux - marco de automatización de pruebas con comandos de ejecución de estilo Expect.

Ir

  • GoExpect: paquete similar a Expect para el lenguaje Go
  • go-expect: una biblioteca de lenguaje Go similar a Expect para automatizar el control de programas basados ​​en terminal o consola.

Genial

  • expect4groovy: una implementación Groovy DSL de la herramienta Expect.

Java

  • ExpectIt: una implementación pura de la herramienta Expect en Java 1.6+. Está diseñada para ser simple, fácil de usar y extensible.
  • expect4j: un intento de clonar Java del Expect original
  • ExpectJ: una implementación en Java de la utilidad expect de Unix
  • Expect-for-Java: implementación pura en Java de la herramienta Expect
  • expect4java: una implementación en Java de la herramienta Expect, pero que admite cierres anidados. También hay un contenedor para DSL del lenguaje Groovy.

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 pseudoterminal
  • winpexpect — puerto de pexpect para la plataforma Windows
  • paramiko-expect: una extensión similar a expect de Python para la biblioteca SSH Paramiko que también admite registros de seguimiento.

Rubí

  • RExpect: un reemplazo directo del módulo expect.rb en la biblioteca estándar.
  • Expect4r: Interactúe con Cisco IOS, IOS-XR y Juniper JUNOS CLI

Óxido

  • rexpect - paquete similar a pexpect para el lenguaje Rust.

Escala

  • scala-expect: una implementación de Scala de un subconjunto muy pequeño de la herramienta Expect.

Caparazón

  • Empty: utilidad similar a la esperada para ejecutar comandos interactivos en los scripts de shell de Unix
  • sexpect — Se espera de los shells. Se implementa en el modelo cliente/servidor que también admite adjuntar/desconectar (como GNU screen ).

Referencias

  1. ^ "Preguntas frecuentes sobre Expect: Nuestra política de empresa exige una licencia para utilizar Expect. ¿Dónde podemos obtenerla?". 2006-10-11.
  2. ^ Nemeth, Evi; Snyder, Garth; Seebass, Scott; Hein, Trent (29 de agosto de 2000). Manual de administración de sistemas UNIX. Pearson Education. ISBN 978-0-13-700291-7.
  3. ^ Mckay, David (24 de mayo de 2021) [24 de mayo de 2021]. "Automatizar las entradas a los scripts de Linux con el comando expect". category/Linux . Consultado el 28 de noviembre de 2023 .{{cite web}}: Mantenimiento CS1: fecha y año ( enlace )
  4. ^ Carling, M.; Degler, Stephen; Dennis, James (2000). Administración de sistemas Linux. Sams Publishing. ISBN 978-1-56205-934-7.
  5. ^ "Tcl/Tk en el desarrollo de interfaces gráficas de usuario extensibles por el usuario". www.usenix.org . Consultado el 11 de agosto de 2022 .

Lectura adicional

  • Sitio web oficial
  • Esperar en SourceForge
  • Cuándo utilizar secuencias de comandos Expect y cuándo evitarlas en Wayback Machine (archivado el 25 de octubre de 2017) (IBM Developerworks)
Obtenido de "https://es.wikipedia.org/w/index.php?title=Esperar&oldid=1226968664"