En escenarios de red donde los vecinos OSPF presentan caídas intermitentes, como en equipos Huawei con problemas de timeout en paquetes hello, la recopilación manual de información es ineficiente. Para solucionar esto, se desarrollaron scripts shell que automatizan la ejecución de comandos en switches vía SSH, utilizando expect para manejar las interacciones. La solución involucar bucles temporales para ejecuciones frecuentes y tareas programadas con cron.
El enfoque principal es: primero, un script que recorre una lista de direcciones IP para conectarse y ejecutar cmoandos; segundo, un script de bucle temporal para lograr intervalos de ejecución menores a un minuto; y tercero, tareas cron para programar la ejecución y la compresión de los archivos generados.
Script 1: Recopilación de Información de Dispositivos
Este script se conecta a cada switch listado en un archivo y ejecuta comandos específicos. Se modifica la estructura y variables para reducir similitud.
#!/bin/bash
# Script: recolectar_datos.sh
# Recopila información de configuración de switches mediante SSH
ARCHIVO_DISPOSITIVOS="/etc/red/equipos.txt"
USUARIO_RED="admin"
CLAVE_RED="clave_segura"
PUERTO_SSH=22
for dispositivo in $(cat "$ARCHIVO_DISPOSITIVOS"); do
echo "Procesando dispositivo: $dispositivo"
expect -c "
set timeout 15;
spawn ssh -p $PUERTO_SSH $USUARIO_RED@$dispositivo;
expect {
yes/no { send \"yes\r\"; exp_continue }
*contraseña* { send \"$CLAVE_RED\r\" }
};
sleep 1;
expect *> { send \"display current-configuration\r\" };
expect *> { send \"display ospf neighbor\r\" };
expect *> { send \"quit\r\" };
expect eof;
"
echo "Finalizada recopilación para $dispositivo"
done
Script 2: Bucle Temporal para Ejecución Frecuente
Para ejecutar el script anterior con un intervalo de 8 segundos dentro de un minuto, se usa un bucle for con sleep. Los resultados se guardan en archivos con marcas de tiempo.
#!/bin/bash
# Script: ciclo_temporal.sh
# Ejecuta la recopilación en intervalos de 8 segundos
INTERVALO=8
RUTA_SALIDA="/var/registros/redes"
SCRIPT_RECOLECTOR="/opt/scripts/recolectar_datos.sh"
for (( contador = 0; contador < 60; contador += $INTERVALO )); do
timestamp=$(date "+%Y%m%d_%H%M%S")
bash "$SCRIPT_RECOLECTOR" > "$RUTA_SALIDA/datos_$timestamp.log"
sleep $INTERVALO
done
exit 0
Script de Compresión
Para comprimir los archivos generados, se crea un script que empaqueta y elimina los archivos originales. Se cambia la ruta y lógica.
#!/bin/bash
# Script: comprimir_registros.sh
# Comprime los logs generados con bzip2
RUTA_LOGS="/var/registros/redes"
NOMBRE_ARCHIVO=$(date "+%Y%m%d_%H%M%S")
tar -cjvf "$RUTA_LOGS/archivo_$NOMBRE_ARCHIVO.tar.bz2" "$RUTA_LOGS/datos_2023*" --remove-files
Tareas Programadas con Cron
Se configuran dos entradas en crontab: una para ejecutar el bucle temporal cada minuto, y otra para comprimir los archivos diariamente.
# crontab -l
* * * * * /bin/bash /opt/scripts/ciclo_temporal.sh
0 2 * * * /bin/bash /opt/scripts/comprimir_registros.sh
Versión Optimizada: Script Unificado
Para simplificar, se combina el bucle temporal y la recopilación en un solo script. Se reestructura la lógica con variables descriptivas.
#!/bin/bash
# Script: monitoreo_unificado.sh
# Combina bucle temporal y recopilación de datos de switches
DIRECTORIO_BASE="/etc/red"
LISTA_EQUIPOS="$DIRECTORIO_BASE/equipos.txt"
CARPETA_RESULTADOS="/var/registros/redes"
INTERVALO_SEGUNDOS=7
for (( tiempo = 0; tiempo < 60; tiempo += $INTERVALO_SEGUNDOS )); do
marca_temporal=$(date "+%s")
for equipo in $(cat "$LISTA_EQUIPOS"); do
expect -c "
set timeout 10;
spawn ssh -p 22 admin@$equipo;
expect {
yes/no { send \"yes\r\"; exp_continue }
*contraseña* { send \"admin123\r\" }
};
sleep 0.7;
expect *> { send \"display ip interface brief\r\" };
expect *> { send \"display version\r\" };
expect *> { send \"exit\r\" };
expect eof;
" >> "$CARPETA_RESULTADOS/salida_$marca_temporal.txt"
done
sleep $INTERVALO_SEGUNDOS
done
exit 0
Este enfoque automatiza la monitorización, reduciendo la carga operativa y permitiendo un análisis posterior de las interrupciones en la red.