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
curlyjq. - Automatización con
crony 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:
- Guarde usuarios en un archivo CSV.
- Permita agregar, listar y eliminar usuarios desde un script.
- Use funciones en un archivo separado (
lib/usuarios.sh). - Genere un backup comprimido automáticamente cada día con
cron. - Incluya tests con
batspara validar las funciones.
🏋️♂️ Ejercicio práctico 2
Crea un proyecto analiza_web/ que:
- Lea una lista de URLs desde
urls.txt. - Descargue las páginas en paralelo (usa
xargs -P4oparallel). - Cuente cuántas veces aparece la palabra “error” en cada página.
- Genere un reporte CSV con los resultados.
- Incluya logs y limpieza automática de temporales.
🏋️♂️ Ejercicio práctico 3
Crea un proyecto infra_monitor/ que:
- Se conecte a un servidor remoto con
ssh. - Obtenga estadísticas de
uptime,df -hyfree -m. - Genere un reporte en JSON usando
jq. - Se ejecute cada hora con
cron. - Use
trappara limpiar archivos temporales.
✅ Buenas prácticas generales
- ✅ Estructura clara:
bin/,lib/,logs/,tests/. - ✅ Seguridad: usa
set -Eeuo pipefail, valida entradas y usa rutas absolutas. - ✅ Automatización:
cronosystemd timerspara tareas recurrentes. - ✅ Portabilidad: scripts POSIX si se requiere en varios sistemas.
- ✅ Rendimiento: usa paralelismo (
xargs -P,parallel) para tareas masivas. - ✅ Depuración y calidad: usa
shellcheck,shfmty tests (bats).