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
\rpara 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