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.