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_HOMEen lugar deuh). - Control de flujo:
if,case,for,whilepara tomar decisiones. - Funciones: agrupan tareas, mejoran la legibilidad y facilitan la reutilización.
2. Buenas prácticas
- Uso de
setpara control de errores:set -eaborta al primer error.set -uevita variables sin definir.set -o pipefailhace que el fallo en una tubería se detecte.
- Formateo coherente: indentación de 2 ó 4 espacios y líneas de longitud moderada (<200 caracteres).
- Validación de entradas: comprueba parámetros obligatorios (
if [ -z 1 ]) y muestra un mensaje de uso. - Manejo de errores: captura salidas y códigos de retorno (
,). - Logging: registra acciones en pantalla y/o archivos (
loggero redirección a/var/log). - Modularidad: crea funciones con responsabilidad única y exporta solo lo necesario.
- 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.shmuestra 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 privatekeyy configura los directorios con 700. - Almacenamiento seguro: evita exponer contraseñas en texto plano usa
pass,gpgovault. - 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!

Deja una respuesta