Inicio > Entorno y utilidades > expect

expect: Automatización de scripts interactivos

`expect` es una potente extensión de Tcl utilizada para automatizar la interacción con programas interactivos. Permite la ejecución automática de comandos que requieren entrada del usuario mediante la creación de scripts. Se utiliza principalmente para controlar comandos como `ssh`, `ftp` y `passwd` dentro de scripts.

Descripción general

`expect` automatiza las sesiones interactivas esperando patrones predefinidos (por ejemplo, cadenas de prompt) y luego enviando cadenas específicas (por ejemplo, entrada del usuario). Esto permite realizar tareas complejas sin intervención manual.

Características principales

  • Extensión de lenguaje de scripting basada en Tcl
  • Automatización de la interacción con programas interactivos (por ejemplo, ssh, ftp, telnet)
  • Funcionalidad de coincidencia de patrones de prompt y envío de respuestas
  • Útil para automatizar tareas repetitivas y manuales

Opciones principales

Estas opciones controlan la forma en que se ejecuta el comando `expect` en sí. Son diferentes de los comandos `expect` y `send` utilizados dentro de un script.

Control de ejecución y depuración

Comando generado:

Combina los comandos.

Descripción:

`expect` Ejecutando el comando.

Combina las opciones anteriores para ejecutar virtualmente los comandos junto con la IA.

Instalación

`expect` no suele estar incluido por defecto en la mayoría de las distribuciones de Linux, por lo que debe instalarse a través del gestor de paquetes.

Debian/Ubuntu

sudo apt update && sudo apt install expect

Instala `expect` usando el gestor de paquetes APT.

RHEL/CentOS/Fedora

sudo dnf install expect

Instala `expect` usando el gestor de paquetes DNF (o Yum).

Ejemplos de uso

Los scripts de `expect` suelen tener la extensión `.exp` y comienzan con `#!/usr/bin/expect` para ser ejecutados por el intérprete `expect`.

Respuesta automática simple a un prompt

#!/usr/bin/expect
set timeout 10
spawn sh -c "echo -n 'Proceed? (y/n) '
read response"
expect "Proceed? (y/n) "
send "y\r"
expect eof

Este script responde automáticamente 'y' a preguntas como `Proceed? (y/n)`. (Usa `sh` para el ejemplo)

Automatización de inicio de sesión SSH (Advertencia de seguridad)

#!/usr/bin/expect
set timeout 20
set username "your_user"
set hostname "your_host"
set password "your_password"

spawn ssh $username@$hostname
expect "password:"
send "$password\r"
expect "$"
send "ls -l\r"
expect "$"
send "exit\r"
expect eof

Ejemplo de inicio de sesión automático en un servidor remoto vía SSH y ejecución de comandos. **Incluir contraseñas directamente en scripts es extremadamente peligroso por motivos de seguridad y no se recomienda en entornos reales.**

Automatización del comando passwd (Advertencia de seguridad)

#!/usr/bin/expect
set timeout 10
set old_pass "old_password"
set new_pass "new_password"

spawn passwd
expect "Current password:"
send "$old_pass\r"
expect "New password:"
send "$new_pass\r"
expect "Retype new password:"
send "$new_pass\r"
expect eof

Ejemplo de cambio automático de contraseña usando el comando `passwd`. **Codificar contraseñas en scripts es extremadamente peligroso por motivos de seguridad.**

Consejos y precauciones

Los scripts de `expect` son potentes, pero se deben considerar algunas precauciones para garantizar la seguridad y la estabilidad.

Consejos principales

  • **Seguridad de contraseñas**: Codificar contraseñas directamente en scripts es muy peligroso. Considere usar variables de entorno, archivos de configuración seguros u otros mecanismos de seguridad como `ssh-agent`.
  • **Configuración de tiempo de espera**: Use el comando `set timeout` para establecer el tiempo máximo que `expect` esperará por un patrón específico. El valor predeterminado es 10 segundos, y puede establecer una espera infinita con `set timeout -1`.
  • **Coincidencia de patrones precisa**: `expect` admite expresiones regulares. Dado que los prompts pueden no coincidir exactamente, use patrones flexibles o el comodín `*`.
  • **Depuración**: Ejecutar con `expect -d your_script.exp` en modo de depuración le permite ver en detalle qué patrones está esperando `expect` y qué cadenas está enviando.
  • **Uso de `interact`**: Puede usar el comando `interact` cuando desee transferir el control al usuario en un punto específico durante la ejecución del script.

Comandos de la misma categoría