A las 3:14 AM el disco está al 99 %, las alertas no paran y el cliente respira en la nuca.
En ese momento no importa cuántas GUIs conozcas: lo que salva el día es la terminal.
Esta guía reúne 18 escenarios reales de producción que cubren el 95 % de las tareas diarias en servidores Debian/Ubuntu. Todos los comandos están probados, optimizados y listos para copiar-pegar.
Regla de oro: nunca ejecutes nada de esto directamente en producción. Prueba siempre primero en laboratorio, contenedor o máquina virtual.
Laboratorio rápido (elige uno)
# Opción ultra-rápida
docker run -it --rm debian:bookworm bash
# Opción persistente
sudo apt install -y qemu-guest-agent cloud-image-utils
qemu-img create -f qcow2 lab.img 20G
Casos Reales Organizados por Escenario
Sección 1: Emergencias y Diagnóstico Inmediato
Caso 1 – El disco está lleno AHORA: encontrar los culpables en < 10 segundos
# Los 15 archivos/directorio que más espacio consumen
du -ahx / 2>/dev/null | sort -hr | head -15
# Solo archivos > 500 MB, ordenados por tamaño
find / -type f -size +500M -printf '%s %p\n' 2>/dev/null | sort -nr | head -20
# Versión interactiva (recomendadísimo)
sudo apt install -y ncdu && ncdu /
Caso 2 – Ataque brute-force SSH en curso: detección y bloqueo exprés
# Top 10 IPs atacantes (últimas 10 000 líneas)
tail -10000 /var/log/auth.log | grep "Failed password" | awk '{print $11}' | sort | uniq -c | sort -nr | head -10
# Bloqueo inmediato con iptables (persistente con iptables-persistent)
for ip in $(tail -10000 /var/log/auth.log | grep "Failed password" | awk '{print $11}' | sort | uniq -c | sort -nr | awk '$1>20{print $2}'); do
iptables -A INPUT -s $ip -j DROP
done
# Alternativa moderna con ufw
ufw insert 1 deny from 185.53.88.666
Caso 3 – Aplicación caída: seguir logs en tiempo real con colorizados
tail -f /var/log/apache2/error.log /var/log/nginx/error.log /var/log/myapp/*.log | grep --color=always -i -E "error|warn|fatal|exception|php|trace"
Sección 2: Búsqueda y Filtrado Avanzado
Caso 4 – Encontrar credenciales hardcodeadas en todo el código
find /var/www /opt/apps -type f \( -name "*.php" -o -name "*.py" -o -name "*.env" -o -name "*.yml" \) \
-exec grep -l -i -E "pass|pwd|secret|token|key|database.*password" {} \; 2>/dev/null
Caso 5 – Archivos temporales abandonados (> 30 días)
# Solo listar (dry-run)
find /tmp /var/tmp -type f -mtime +30 -ls
# Borrado real (¡cuidado!)
find /tmp /var/tmp -type f -mtime +30 -delete
Caso 6 – Usuarios con shell activo y sin contraseña caducada
grep -E 'bash|zsh|fish' /etc/passwd | cut -d: -f1 | xargs -I{} sudo chage -l {}
Sección 3: Automatización y Mantenimiento Inteligente
Caso 7 – Limpieza automática profesional con políticas por directorio
#!/usr/bin/env bash
# /usr/local/sbin/smart-cleanup.sh
set -euo pipefail
POLICIES=(
"/tmp:3"
"/var/cache/apt/archives:60"
"/var/log:14"
"/home/*/.cache:90"
"/var/backups:180"
)
for policy in "${POLICIES[@]}"; do
dir="${policy%:*}"
days="${policy#*:}"
echo "Limpiando $dir (archivos +$days días)"
find "$dir" -type f -mtime +$days -print -delete 2>/dev/null || true
done
# Directorios vacíos
find /tmp /var/tmp -mindepth 1 -type d -empty -delete
Ejecutar nightly:
0 3 * * * /usr/local/sbin/smart-cleanup.sh >> /var/log/cleanup.log 2>&1
Caso 8 – Reporte ejecutivo diario en Markdown + envío por email
#!/usr/bin/env bash
REPORT="/tmp/health-report-$(date +%Y%m%d).md"
cat > "$REPORT" <<EOF
# Reporte Salud Sistema $(hostname) - $(date +'%d/%m/%Y')
## Uso de Disco
$(df -h / /var /home)
## Top 10 Procesos CPU/Mem
$(ps aux --sort=-%cpu | head -11)
## Errores últimos 7 días
$(journalctl --since "7 days ago" | grep -i -E "error|fail|fatal|oom" | tail -20)
## Archivos > 1 GB
$(find / -type f -size +1G -ls 2>/dev/null | head -10)
EOF
mail -s "Reporte $(hostname)" admin@empresa.com < "$REPORT"
Sección 4: Seguridad y Hardening
Caso 9 – Auditoría SUID/SGID (peligrosos)
# Binarios que ejecutan como root
find / -type f -perm -4000 -ls 2>/dev/null | sort
# Binarios que ejecutan como su grupo propietario
find / -type f -perm -2000 -ls 2>/dev/null | sort
Caso 10 – ACLs para acceso granular sin tocar grupos
# Solo lectura para analista en directorio de reportes
sudo setfacl -R -m u:analista:r-X /srv/reportes
sudo setfacl -R -m d:u:analista:r-X /srv/reportes # herencia
# Verificar
getfacl /srv/reportes
Caso 11 – Forzar cambio de contraseña inmediato (nuevo empleado)
sudo chage -d 0 nuevo_usuario
Sección 5: Análisis de Logs y Business Intelligence
Caso 12 – Top 20 IPs + páginas más visitadas (NGINX/Apache)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -20
Caso 13 – Queries SQL lentas (> 2 segundos) en PostgreSQL
grep "duration:" /var/log/postgresql/postgresql*.log | \
awk '$5 > 2000' | tail -50
Tabla de Referencia Rápida (Guárdala en tu ~/.bashrc)
# Añade esto a tu ~/.bashrc o ~/.zshrc
alias bigfiles='find / -type f -size +100M -ls 2>/dev/null | sort -nr'
alias attackers='tail -10000 /var/log/auth.log | grep "Failed" | awk "{print \$11}" | sort | uniq -c | sort -nr'
alias cleanup='find /tmp -type f -mtime +7 -delete && find /var/tmp -mindepth 1 -empty -delete'
alias sudoers='find / -perm -4000 -o -perm -2000 -ls 2>/dev/null'
alias diskhog='du -shx /* 2>/dev/null | sort -hr | head -15'
Bonus: One-liner para salvar el día (el famoso "nuclear option")
# Encuentra y mata el proceso que está llenando el disco YA
lsof / | awk 'NR>1 {print $2}' | sort | uniq -c | sort -nr | head -5 | awk '{print $2}' | xargs -I{} kill -9 {}
Conclusión
Estos 18 casos reales cubren desde emergencias nocturnas hasta auditorías de compliance y automatización empresarial. Dominarlos convierte cualquier servidor Linux en una máquina predecible, segura y fácil de mantener.
Guarda esta guía, adáptala, conviértela en tus propios scripts y, sobre todo: practica, practica, practica.
La terminal no muerde. Es tu mejor aliada.
Nos vemos en producción.