Automatización de procesos no interactivos en Shell: Here Document y Expect

En el ámbito de la administración de sistemas, la interacción ocurre cuando enviamos comandos y el programa espera una respuesta manual para continuar. Por el contrario, la automatización o "modo no interactivo" permite enviar esas instrucciones de forma indirecta a través de scripts o herramientas de terceros, eliminando la necesidad de intervención humana constante.

Uso de Here Document para automatización básica

El "Here Document" es una técnica de redirección de E/S que permite enviar una lista de comandos o datos a un programa interactivo. Funciona como un sustituto de la entrada estándar (stdin).

Sintaxis básica

comando <<MARCADOR
contenido_1
contenido_2
MARCADOR

Consideraciones clave:

  • El marcador puede ser cualquier cadena de texto (comúnmente se usa EOF).
  • El marcador de cierre debe estar al inicio de la línea, sin espacios previos ni posteriores.

Ejemplos prácticos

1. Contar líneas de un bloque de texto dinámico:

wc -l <<FIN_BLOQUE
linea A
linea B
linea C
FIN_BLOQUE

2. Cambiar una contraseña de usuario sin intervención:

passwd usuario_demo <<EOF
password123
password123
EOF

3. Sobrescribir o añadir contenido a archivos:

# Sobrescribir con tee
tee archivo_config.txt <<EOF
server_port=8080
enable_logs=true
EOF

# Añadir a un archivo existente
cat <<EOF >> logs.txt
Entrada de log generada el $(date)
EOF

Gestión de variables en Here Documents

Es posible integrar variables del sistema dentro del bloque de texto. Si se desea que las variables se expandan, se usa el marcador normal. Si se desea que se traten como texto literal, se debe envolver el marcador inicial entre comillas simples.

entorno="Produccion"
# Con expansión de variables
cat <<EOF
El servidor está en modo: $entorno
EOF

# Como texto literal (sin expansión)
cat <<'EOF'
El valor de la variable es $entorno
EOF

Automatización aavnzada con Expect

Expect es una herramienta basada en el lenguaje Tcl, diseñada específicamente para automatizar aplicaciones interactivas como SSH, Telnet, FTP o utilidades de contraseñas. Utiliza una lógica de "esperar y responder".

Comandos fundamentales de Expect

  • spawn: Inicia el comando que queremos monitorizar.
  • expect: Define la cadena de texto que el script espera recibir del programa.
  • send: Envía la respuesta automática (es crucial incluir \r para simular el "Enter").
  • interact: Devuelve el control al usuario tras completar la automatización.
  • expect eof: Finaliza el script cuando el proceso hijo termina.

Automatización de cambio de contraseña con script Expect

#!/usr/bin/expect
set timeout 10
set target_user [lindex $argv 0]
set new_pass [lindex $argv 1]

spawn passwd $target_user
expect "Nueva contraseña:"
send "$new_pass\r"
expect "Retipcle la nueva contraseña:"
send "$new_pass\r"
expect eof

Gestión de conexiones SSH con manejo de errores

Este script gestiona la aceptación de claves de host y el envío de contraseña:

#!/usr/bin/expect
set ip_host "192.168.1.50"
set pass "secreto123"

spawn ssh root@$ip_host

expect {
    "yes/no" { send "yes\r"; exp_continue }
    "password:" { send "$pass\r" }
    "Connection refused" { send_user "Error: Conexión rechazada\n"; exit }
}
interact

Implementación de Expect dentro de Bash (Modo Embebido)

Es común integrar bloques de Expect dentro de un script de Bash convencional para aprovechar las capacidades de ambos entornos.

#!/bin/bash
NUEVO_USUARIO="operador"
PASS_TEMPORAL="Temp2024!"

useradd $NUEVO_USUARIO

# Inicio de bloque Expect embebido
/usr/bin/expect <<-EOF
spawn passwd $NUEVO_USUARIO
expect "Nueva contraseña:"
send "$PASS_TEMPORAL\r"
expect "Retipcle la nueva contraseña:"
send "$PASS_TEMPORAL\r"
expect eof
EOF

echo "El usuario $NUEVO_USUARIO ha sido creado y configurado."

Caso de uso: Particionado de disco automatizado

El siguiente ejemplo automatiza la creación de una partición de 2GB en un disco secundario, su formateo y montaje mediante la combinación de Bash y Expect.

#!/bin/bash
DISCO="/dev/sdb"
PUNTO_MONTAJE="/mnt/datos_storage"

# Automatización de fdisk
/usr/bin/expect <<EOF
spawn fdisk $DISCO
expect "Orden (m para obtener ayuda):"
send "n\r"
expect "Seleccionar (predeterminado p):"
send "p\r"
expect "Número de partición"
send "1\r"
expect "Primer sector"
send "\r"
expect "Último sector"
send "+2G\r"
expect "Orden (m para obtener ayuda):"
send "w\r"
expect eof
EOF

# Preparación del sistema de archivos
if mkfs.ext4 "${DISCO}1"; then
    mkdir -p $PUNTO_MONTAJE
    mount "${DISCO}1" $PUNTO_MONTAJE
    echo "Operación exitosa" > "$PUNTO_MONTAJE/status.log"
    echo "Configuración completada en $PUNTO_MONTAJE"
else
    echo "Error en la creación del sistema de archivos"
    exit 1
fi

Etiquetas: bash shell-scripting expect-tool linux-automation here-document

Publicado el 7-23 12:25