Este artículo necesita citas adicionales para su verificación . ( mayo de 2017 ) |
Autor(es) original(es) | Don Libés |
---|---|
Desarrollador(es) | Nils Carlson |
Versión estable | 5.45.4 / 4 de febrero de 2018 ( 04-02-2018 ) |
Escrito en | do |
Sistema operativo | POSIX , ventanas |
Licencia | Dominio público [1] |
Sitio web | core.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.
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]
Esta sección está escrita como un manual o una guía . ( Diciembre de 2020 ) |
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
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.
{{cite web}}
: Mantenimiento CS1: fecha y año ( enlace )