Curso de Shell Scripting

En este módulo veremos 3 proyectos reales que integran los temas de:

  • Funciones, modularización y seguridad.
  • Procesamiento de texto y logs.
  • Uso de APIs con curl y jq.
  • Automatización con cron y SSH.
  • Optimización y paralelismo.
  • Testing y depuración.

📦 Proyecto 1: Respaldo y Limpieza Automática de Logs

Objetivo: Automatizar el respaldo de los logs de un servidor y limpiar los antiguos.


▸ Estructura de carpetas

log_manager/
├── bin/
│   └── backup_logs.sh
├── lib/
│   └── funciones.sh
└── logs/

▸ lib/funciones.sh

1#!/usr/bin/env bash
2set -Eeuo pipefail
3
4backup_logs() {
5  local SRC="$1"
6  local DEST="$2"
7  local FECHA
8  FECHA=$(date +%Y%m%d)
9
10  mkdir -p "$DEST"
11  tar -czf "$DEST/logs_$FECHA.tar.gz" "$SRC"
12  echo "✅ Backup creado: $DEST/logs_$FECHA.tar.gz"
13}
14
15limpiar_logs_antiguos() {
16  local SRC="$1"
17  local DIAS="$2"
18  find "$SRC" -name "*.log" -mtime +"$DIAS" -delete
19  echo "🧹 Logs antiguos eliminados"
20}

▸ bin/backup_logs.sh

1#!/usr/bin/env bash
2set -Eeuo pipefail
3source "$(dirname "$0")/../lib/funciones.sh"
4
5SRC="/var/log"
6DEST="$HOME/backups"
7
8backup_logs "$SRC" "$DEST"
9limpiar_logs_antiguos "$SRC" 30

▸ Programación con cron

Ejecutar cada día a las 02:00:

0 2 * * * /home/usuario/log_manager/bin/backup_logs.sh >> /home/usuario/log_manager/logs/backup.log 2>&1

👉 Integra modularización, seguridad y scheduling.


🌐 Proyecto 2: Monitoreo de Servidor con API y Alertas

Objetivo: Consultar una API para verificar el estado de un servicio y enviar alertas si falla.


▸ Estructura

monitor/
├── monitor.sh
└── .env

▸ monitor.sh

1#!/usr/bin/env bash
2set -Eeuo pipefail
3
4# Cargar configuración
5source .env
6
7URL="https://api.example.com/health"
8RESPUESTA=$(curl -s -w "%{http_code}" -o /tmp/salida.json "$URL")
9
10if [ "$RESPUESTA" -ne 200 ]; then
11  echo "❗ Servicio caído. Código: $RESPUESTA" | mail -s "Alerta de Servicio" "$ADMIN_EMAIL"
12else
13  ESTADO=$(jq -r '.status' /tmp/salida.json)
14  echo "✅ Servicio en estado: $ESTADO"
15fi
16
17rm -f /tmp/salida.json

▸ .env (ejemplo)

1ADMIN_EMAIL="admin@example.com"

Buenas prácticas:

  • Separamos la configuración sensible.
  • Validamos el código HTTP.
  • Limpiamos archivos temporales.

▸ Programación con cron

Ejecutar cada 10 minutos:

*/10 * * * * /home/usuario/monitor/monitor.sh >> /home/usuario/monitor/monitor.log 2>&1

🚀 Proyecto 3: Despliegue de Aplicación Web con SSH y Rsync

Objetivo: Automatizar el despliegue de una aplicación web en un servidor remoto.


▸ Estructura

deploy_app/
└── deploy.sh

▸ deploy.sh

1#!/usr/bin/env bash
2set -Eeuo pipefail
3
4PROYECTO="mi_web"
5SERVIDOR="usuario@203.0.113.10"
6DESTINO="/var/www/$PROYECTO"
7
8echo "📦 Comprimendo proyecto..."
9tar -czf "$PROYECTO.tar.gz" "$PROYECTO"
10
11echo "📤 Subiendo al servidor..."
12scp "$PROYECTO.tar.gz" "$SERVIDOR:/tmp/"
13
14echo "🚀 Desplegando en el servidor..."
15ssh "$SERVIDOR" "
16  mkdir -p $DESTINO &&
17  tar -xzf /tmp/$PROYECTO.tar.gz -C $DESTINO &&
18  rm /tmp/$PROYECTO.tar.gz &&
19  sudo systemctl restart nginx
20"
21
22echo "✅ Despliegue completado"

👉 Integra:

  • Compresión (tar)
  • Transferencia (scp)
  • Automatización remota (ssh)
  • Reinicio del servicio

⚡ Proyecto 4: Procesamiento Masivo y Paralelo de Logs

Objetivo: Acelerar el análisis de miles de archivos de log.


1#!/usr/bin/env bash
2set -Eeuo pipefail
3
4mkdir -p resultados
5
6ls *.log | xargs -n1 -P4 bash -c '
7  archivo="$1"
8  errores=$(grep -c "ERROR" "$archivo")
9  echo "$archivo: $errores" > "resultados/${archivo%.log}_errores.txt"
10' _

👉 Integra:

  • Procesamiento paralelo (xargs -P4)
  • Búsqueda de patrones (grep)
  • Escritura segura en resultados

🏋️‍♂️ Ejercicio práctico 1

Crea un proyecto gestion_usuarios/ que:

  1. Guarde usuarios en un archivo CSV.
  2. Permita agregar, listar y eliminar usuarios desde un script.
  3. Use funciones en un archivo separado (lib/usuarios.sh).
  4. Genere un backup comprimido automáticamente cada día con cron.
  5. Incluya tests con bats para validar las funciones.

🏋️‍♂️ Ejercicio práctico 2

Crea un proyecto analiza_web/ que:

  1. Lea una lista de URLs desde urls.txt.
  2. Descargue las páginas en paralelo (usa xargs -P4 o parallel).
  3. Cuente cuántas veces aparece la palabra “error” en cada página.
  4. Genere un reporte CSV con los resultados.
  5. Incluya logs y limpieza automática de temporales.

🏋️‍♂️ Ejercicio práctico 3

Crea un proyecto infra_monitor/ que:

  1. Se conecte a un servidor remoto con ssh.
  2. Obtenga estadísticas de uptime, df -h y free -m.
  3. Genere un reporte en JSON usando jq.
  4. Se ejecute cada hora con cron.
  5. Use trap para limpiar archivos temporales.

✅ Buenas prácticas generales

  1. Estructura clara: bin/, lib/, logs/, tests/.
  2. Seguridad: usa set -Eeuo pipefail, valida entradas y usa rutas absolutas.
  3. Automatización: cron o systemd timers para tareas recurrentes.
  4. Portabilidad: scripts POSIX si se requiere en varios sistemas.
  5. Rendimiento: usa paralelismo (xargs -P, parallel) para tareas masivas.
  6. Depuración y calidad: usa shellcheck, shfmt y tests (bats).