Bash Script – DÍA 7

Proyecto final: Script profesional de chequeo de servidores

(el mejor cierre práctico para un técnico de sistemas)

1. Objetivo del día

Hoy vas a crear un script real de producción, capaz de:

  • hacer ping a uno o varios servidores
  • comprobar resolución DNS
  • comprobar un puerto (ej: 443)
  • comprobar respuesta HTTP (si aplica)
  • generar un informe limpio en un archivo
  • aceptar varios hosts o un archivo con hosts
  • usar funciones, pipes, redirecciones y ejecución segura

Este proyecto te convierte en alguien capaz de escribir scripts útiles para cualquier equipo técnico.


🧩 (Opcional) Añadir métricas de CPU, RAM o disco

Si quieres ampliar tu script general y hacerlo aún más completo, aquí tienes un recordatorio práctico de cómo obtener estas métricas:

CPU — carga promedio

uptime | awk '{print $(NF-2), $(NF-1), $NF}'

RAM — memoria usada/libre

free -h | awk '/Mem:/ {print "Usada:", $3, "Libre:", $4}'

Disco — uso del sistema de archivos raíz

df -h / | awk 'NR==2 {print "Uso disco raíz:", $5}'

Ejemplo para integrarlo en el script (opcional)

check_recursos() {
    cpu=$(uptime | awk '{print $(NF-2), $(NF-1), $NF}')
    ram=$(free -h | awk '/Mem:/ {print $3 "/" $2}')
    disco=$(df -h / | awk 'NR==2 {print $5}')

    log "CPU Load:  $cpu"
    log "RAM:       $ram"
    log "Disco /:   $disco"
}

Y luego llamarlo dentro de procesar_host():

check_recursos

Salida típica en el informe:

CPU Load: 0.12, 0.10, 0.08
RAM:      2.1G/8.0G
Disco /:  45%

2. Estructura profesional del script

El script seguirá esta estructura estándar:

#!/bin/bash

# 1. Configuración y validaciones
# 2. Funciones
# 3. Lógica principal (main)
# 4. Ejecución

3. Script completo

A continuación tienes un script totalmente funcional y modular.


3.1. Configuración inicial

#!/bin/bash

# --- Configuración inicial ---
LOG="informe_servidor.log"
> "$LOG"    # Vacía el log al iniciar

if [[ $# -lt 1 ]]; then
    echo "Uso: $0 <host1> [host2 host3 ...]  o  $0 -f archivo_de_hosts"
    exit 1
fi

3.2. Funciones del script

# --- Funciones ---

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG"
}

check_ping() {
    ping -c1 "$1" > /dev/null 2>&1
    [[ $? -eq 0 ]] && echo "OK" || echo "FAIL"
}

check_dns() {
    nslookup "$1" > /dev/null 2>&1
    [[ $? -eq 0 ]] && echo "OK" || echo "FAIL"
}

check_port() {
    nc -z "$1" "$2" > /dev/null 2>&1
    [[ $? -eq 0 ]] && echo "ABIERTO" || echo "CERRADO"
}

check_http() {
    status=$(curl -s -o /dev/null -w "%{http_code}" "http://$1")
    echo "$status"
}

3.3. Función para procesar un archivo con hosts

procesar_archivo() {
    while IFS= read -r host; do
        procesar_host "$host"
    done < "$1"
}

3.4. Función principal que analiza un host

procesar_host() {
    host="$1"
    log "=== Analizando servidor: $host ==="

    ping_result=$(check_ping "$host")
    dns_result=$(check_dns "$host")
    port_result=$(check_port "$host" 443)
    http_result=$(check_http "$host")

    log "Ping:       $ping_result"
    log "DNS:        $dns_result"
    log "Puerto 443: $port_result"
    log "HTTP:       $http_result"

    # Si quieres añadir CPU/RAM/Disco, descomenta:
    # check_recursos

    log "-----------------------------------"
}

3.5. Lógica principal (main)

Incluye validación si se usa -f.

main() {
    if [[ "$1" = "-f" ]]; then
        if [[ -z "$2" || ! -f "$2" ]]; then
            echo "Debes indicar un archivo válido después de -f"
            exit 1
        fi
        procesar_archivo "$2"
    else
        for host in "$@"; do
            procesar_host "$host"
        done
    fi
}

4. Ejecución del script

main "$@"

5. Uso del script

Guardar como:

check_servidor.sh

Dar permisos:

chmod +x check_servidor.sh

Ejemplo 1: varios hosts

./check_servidor.sh google.com github.com 8.8.8.8

Ejemplo 2: archivo con hosts

./check_servidor.sh -f servidores.txt

Ejemplo de servidores.txt:

google.com
github.com
192.168.1.10
srv-interno-01

6. Ejemplo de informe generado

[2025-02-17 10:55:30] === Analizando servidor: google.com ===
[2025-02-17 10:55:30] Ping:       OK
[2025-02-17 10:55:30] DNS:        OK
[2025-02-17 10:55:30] Puerto 443: ABIERTO
[2025-02-17 10:55:30] HTTP:       200
-----------------------------------

7. Práctica guiada

  1. Crear mis_hosts.txt
  2. Añadir 5 hosts
  3. Ejecutar: ./check_servidor.sh -f mis_hosts.txt
  4. Revisar el informe generado
  5. Mejorar el script:
    • Añadir puertos adicionales (22, 80, 8080…)
    • Añadir CPU/RAM/Disco
    • Enviar alerta si un host falla
    • Guardar informes históricos

8. Checklist del Día 7

El script debe:

  • estar dividido en funciones
  • aceptar varios hosts
  • aceptar un archivo con hosts
  • hacer ping
  • comprobar DNS
  • comprobar puertos
  • comprobar HTTP
  • usar pipes, redirecciones y códigos de salida
  • generar un informe limpio
  • tener estructura profesional

Si todo está marcado…

👉 Has completado Bash Script como un auténtico administrador de sistemas.


⭐ Cierre del Mini-Tutorial de Bash Script

Has completado un recorrido intensivo en solo 7 días.

Ya no solo sabes ejecutar comandos:
sabes automatizarlos de forma profesional.

Has aprendido:

  • variables
  • condicionales
  • bucles
  • argumentos
  • procesar archivos
  • pipes y redirecciones
  • funciones
  • modularización
  • chequeos de servidores
  • generación de informes

Este curso no pretende crear expertos…
pero sí técnicos útiles desde el primer día, el espíritu de tus Mini Tutoriales de Emergencia.