Desarrollo de scripts shell: buenas prácticas y ejemplos útiles

Desarrollo de scripts shell: buenas prácticas y ejemplos útiles

Introducción

El scripting shell es una habilidad esencial para administradores de sistemas, desarrolladores y profesionales de operaciones. Con un buen guion shell podemos automatizar tareas repetitivas, mejorar la eficiencia y reducir errores humanos. En este artículo presentamos un conjunto de buenas prácticas, ejemplos concretos y sugerencias de uso en entornos productivos, incluyendo despliegues de VPN como OpenVPN, WireGuard o NordVPN.

1. Fundamentos del scripting shell

Antes de profundizar en consejos avanzados, repasemos los elementos básicos:

  • Shebang: la primera línea (#!/bin/bash, #!/usr/bin/env bash) define el intérprete.
  • Comentarios: documentan el propósito de bloques (# Comentario).
  • Variables: defínelas claramente y evita nombres ambiguos (USER_HOME en lugar de uh).
  • Control de flujo: if, case, for, while para tomar decisiones.
  • Funciones: agrupan tareas, mejoran la legibilidad y facilitan la reutilización.

2. Buenas prácticas

  1. Uso de set para control de errores:
    • set -e aborta al primer error.
    • set -u evita variables sin definir.
    • set -o pipefail hace que el fallo en una tubería se detecte.
  2. Formateo coherente: indentación de 2 ó 4 espacios y líneas de longitud moderada (<200 caracteres).
  3. Validación de entradas: comprueba parámetros obligatorios (if [ -z 1 ]) y muestra un mensaje de uso.
  4. Manejo de errores: captura salidas y códigos de retorno (, ).
  5. Logging: registra acciones en pantalla y/o archivos (logger o redirección a /var/log).
  6. Modularidad: crea funciones con responsabilidad única y exporta solo lo necesario.
  7. Portabilidad: evita sintaxis propietaria si usas Bash, decláralo explícitamente.

3. Manejo de errores y depuración

Incorporar mecanismos para detectar y registrar fallos es vital:

  • Capturar códigos de salida: RC= tras un comando y decidir acciones.
  • Depuración interactiva: bash -x script.sh muestra cada línea antes de ejecutarla.
  • Funciones de “trap”: limpian recursos al recibir señales (trap cleanup EXIT).

4. Ejemplos útiles de scripts

4.1. Limpieza de directorios temporales

#!/usr/bin/env bash
set -euo pipefail

TMP_DIR=/tmp/old_sessions
DAYS= 7

function clean_temp() {
  echo Limpiando archivos en {TMP_DIR} de más de {DAYS} días...
  find {TMP_DIR} -type f -mtime {DAYS} -print -delete
  echo Operación completada.
}

clean_temp
  

4.2. Monitorización de servicios

#!/usr/bin/env bash
set -e

SERVICE=nginx

if systemctl is-active --quiet {SERVICE} then
  echo {SERVICE} está activo.
else
  echo {SERVICE} NO está activo. Intentando reiniciar...
  systemctl restart {SERVICE}  {
    echo No se pudo reiniciar {SERVICE}. >2
    exit 1
  }
  echo {SERVICE} reiniciado correctamente.
fi
  

5. Automatización de despliegue de VPN

Un uso frecuente de scripting shell es desplegar o configurar túneles seguros. A continuación, ejemplos para OpenVPN y WireGuard.

5.1. Script de instalación para OpenVPN

#!/usr/bin/env bash
set -euo pipefail

# Variables de configuración
OVPN_DIR=/etc/openvpn
CONF_URL=https://example.com/client.ovpn
USER=usuario_vpn

function instalar_paquetes() {
  apt-get update
  apt-get install -y openvpn
}

function descargar_config() {
  wget -O {OVPN_DIR}/{USER}.conf {CONF_URL}
}

function iniciar_vpn() {
  systemctl start openvpn@{USER}
  systemctl enable openvpn@{USER}
}

# Ejecución
instalar_paquetes
descargar_config
iniciar_vpn

echo OpenVPN configurado para {USER}.
  

5.2. Script de configuración rápida para WireGuard

#!/usr/bin/env bash
set -euo pipefail

WG_CONF=/etc/wireguard/wg0.conf
WG_INTERFACE=wg0

function generar_claves() {
  umask 077
  wg genkey  tee privatekey  wg pubkey > publickey
}

function crear_config() {
  cat < {WG_CONF}
[Interface]
PrivateKey = (cat privatekey)
Address = 10.0.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = PEER_PUBLIC_KEY
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0
EOF
}

function levantar_interfaz() {
  wg-quick up {WG_INTERFACE}
}

generar_claves
crear_config
levantar_interfaz

echo WireGuard en marcha (interfaz {WG_INTERFACE}).
  

6. Seguridad y permisos

Al manejar credenciales y claves:

  • Permisos restrictivos: chmod 600 privatekey y configura los directorios con 700.
  • Almacenamiento seguro: evita exponer contraseñas en texto plano usa pass, gpg o vault.
  • Usuarios sin privilegios: ejecuta servicios de VPN bajo cuentas dedicadas.

7. Tablas de resumen de comandos útiles

Comando Descripción
set -euo pipefail Control riguroso de errores y variables no definidas.
trap comando EXIT Ejecuta limpieza al finalizar el script.
logger mensaje Registra eventos en syslog.

Conclusión

El desarrollo de scripts shell bien estructurados y documentados es clave para mantener entornos robustos y fáciles de mantener. Aplicando las buenas prácticas aquí presentadas y adaptando los ejemplos a tus necesidades, podrás automatizar tareas complejas, desplegar soluciones de VPN como OpenVPN, WireGuard o NordVPN, y mejorar la seguridad de tus infraestructuras. ¡Manos a la obra!

Download TXT




Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *