red-y-automatizacion
Red y automatización
Section titled “Red y automatización”Uso de Bash para interactuar con servicios de red, ejecutar tareas en equipos remotos y programar ejecuciones periódicas.
curl y wget
Section titled “curl y wget”Transfiere datos con muchos protocolos; es la herramienta habitual para HTTP.
curl https://example.com # muestra el cuerpocurl -s https://example.com # silencioso (sin barra de progreso)curl -sS https://example.com # silencioso, pero muestra errorescurl -o pagina.html https://example.com # guarda con nombrecurl -O https://example.com/fichero.zip # guarda con el nombre remotocurl -L https://example.com # sigue redireccionescurl -I https://example.com # solo cabeceras (HEAD)curl -i https://example.com # cabeceras y cuerpocurl -f https://example.com/noexiste # falla (código distinto de 0) si HTTP >= 400curl --max-time 10 https://example.com # tiempo máximo totalPeticiones con datos
Section titled “Peticiones con datos”curl -X POST -d "usuario=ana&tema=bash" https://example.com/formulario
curl -X POST https://example.com/api \ -H "Content-Type: application/json" \ -d '{"clave": "valor"}'
curl -H "Authorization: Bearer $TOKEN" https://example.com/api/datoscurl -A "MiAgente/1.0" https://example.com # cambiar User-Agentcurl -b "sesion=abc" -c cookies.txt https://example.com # enviar y guardar cookiesLos tokens y contraseñas se leen de variables de entorno o ficheros protegidos, no se escriben en el script.
Obtener solo el código HTTP
Section titled “Obtener solo el código HTTP”codigo=$(curl -s -o /dev/null -w "%{http_code}" https://example.com)echo "$codigo"Otras variables de -w: %{time_total}, %{size_download}, %{redirect_url}.
Comprobar disponibilidad en un script
Section titled “Comprobar disponibilidad en un script”function web_ok(){ [[ $(curl -s -o /dev/null -w "%{http_code}" --max-time 5 "$1") == 200 ]]}
web_ok https://example.com && echo "Disponible" || echo "No disponible"Orientado a descargas.
wget https://example.com/fichero.zipwget -q https://example.com/fichero.zip # silenciosowget -O nombre.zip https://example.com/f.zip # nombre de salidawget -c https://example.com/grande.iso # reanuda una descarga interrumpidawget -i urls.txt # descarga una lista de URLswget -qO- https://example.com # imprime en stdout (como curl)| curl | wget | |
|---|---|---|
| Uso principal | Peticiones y APIs | Descargas |
| Salida por defecto | stdout | Fichero |
| Reanudar descargas | -C - |
-c |
| Descarga recursiva | No | Sí (-r) |
Conexiones con /dev/tcp y nc
Section titled “Conexiones con /dev/tcp y nc”/dev/tcp
Section titled “/dev/tcp”Bash puede abrir conexiones TCP sin herramientas externas (si no se compiló sin esa opción).
# Comprobar si un puerto está abierto(echo > /dev/tcp/192.0.2.10/22) 2>/dev/null && echo "abierto" || echo "cerrado"
# Con tiempo máximo para evitar esperas largastimeout 1 bash -c 'echo > /dev/tcp/192.0.2.10/22' 2>/dev/null && echo "abierto"Enviar una petición HTTP a mano:
exec 3<> /dev/tcp/example.com/80printf 'GET / HTTP/1.0\r\nHost: example.com\r\n\r\n' >&3cat <&3exec 3>&-/dev/tcp es una característica de Bash, no un fichero real; no funciona con ls ni en otras shells.
nc (netcat)
Section titled “nc (netcat)”nc -zv 192.0.2.10 22 # comprueba un puerto (-z sin enviar datos, -v detallado)nc -zv -w 1 192.0.2.10 20-25 # rango de puertos con 1 s de esperanc -zvu 192.0.2.10 53 # UDPTransferir un fichero entre dos equipos (la sintaxis exacta varía según la variante de nc):
# Receptornc -l 9000 > recibido.txt # (algunas variantes requieren: nc -l -p 9000)
# Emisornc 192.0.2.10 9000 < fichero.txtConsultar un servicio de texto:
printf 'HEAD / HTTP/1.0\r\nHost: example.com\r\n\r\n' | nc example.com 80Otras herramientas de diagnóstico
Section titled “Otras herramientas de diagnóstico”ping -c 4 example.com # conectividadss -tulpn # puertos en escucha (-t TCP, -u UDP, -l escucha, -p proceso, -n numérico)ip a # interfaces y direccionesip route # tabla de rutasdig +short example.com # resolución DNShost example.comtraceroute example.comSSH y scp en scripts
Section titled “SSH y scp en scripts”Autenticación con claves
Section titled “Autenticación con claves”ssh-keygen -t ed25519 -C "comentario" # genera el par de clavesssh-copy-id usuario@192.0.2.10 # instala la clave pública en el servidorssh usuario@192.0.2.10 # conexión sin contraseñaLa clave privada (~/.ssh/id_ed25519) nunca se comparte ni se incluye en el script o en un repositorio. Debe tener permisos 600.
Ejecutar comandos remotos
Section titled “Ejecutar comandos remotos”ssh usuario@192.0.2.10 'uptime'ssh usuario@192.0.2.10 'df -h /; free -h'ssh usuario@192.0.2.10 "ls $directorio_local" # $directorio_local se expande AQUÍssh usuario@192.0.2.10 'ls $HOME' # $HOME se expande en el servidorEjecutar un script local en el servidor remoto
Section titled “Ejecutar un script local en el servidor remoto”ssh usuario@192.0.2.10 'bash -s' < script_local.shssh usuario@192.0.2.10 'bash -s' -- arg1 arg2 < script_local.shOpciones útiles en automatización
Section titled “Opciones útiles en automatización”ssh -o BatchMode=yes -o ConnectTimeout=5 usuario@192.0.2.10 'hostname'| Opción | Efecto |
|---|---|
BatchMode=yes |
No pregunta contraseñas ni confirmaciones; falla en su lugar |
ConnectTimeout=N |
Tiempo máximo de conexión |
-p PUERTO |
Puerto distinto de 22 |
-i fichero |
Clave privada concreta |
-n |
No lee stdin (necesario al usar ssh dentro de un while read) |
-T |
Sin pseudo-terminal |
Recorrer varios servidores
Section titled “Recorrer varios servidores”while IFS= read -r host; do echo "== $host ==" ssh -n -o BatchMode=yes -o ConnectTimeout=5 "usuario@$host" 'uptime' || echo "Fallo en $host"done < servidores.txtArchivo de configuración
Section titled “Archivo de configuración”~/.ssh/config evita repetir parámetros:
Host servidor1 HostName 192.0.2.10 User usuario Port 22 IdentityFile ~/.ssh/id_ed25519ssh servidor1scp y rsync
Section titled “scp y rsync”scp fichero.txt usuario@192.0.2.10:/tmp/ # subirscp usuario@192.0.2.10:/var/log/app.log . # descargarscp -r carpeta usuario@192.0.2.10:/tmp/ # directoriorsync -avz -e ssh carpeta/ usuario@192.0.2.10:/tmp/carpeta/Tareas programadas: cron y at
Section titled “Tareas programadas: cron y at”Ejecuta comandos periódicamente.
crontab -e # editar las tareas del usuariocrontab -l # listarcrontab -r # eliminar todas (sin confirmación)Formato
Section titled “Formato”┌──────── minuto (0-59)│ ┌────── hora (0-23)│ │ ┌──── día del mes (1-31)│ │ │ ┌── mes (1-12)│ │ │ │ ┌ día de la semana (0-7, 0 y 7 = domingo)│ │ │ │ │* * * * * comando| Expresión | Significado |
|---|---|
* * * * * |
Cada minuto |
*/5 * * * * |
Cada 5 minutos |
0 * * * * |
Cada hora en punto |
30 2 * * * |
Cada día a las 02:30 |
0 9 * * 1-5 |
De lunes a viernes a las 09:00 |
0 0 1 * * |
El día 1 de cada mes a medianoche |
@reboot |
Al arrancar el sistema |
@daily, @weekly |
Atajos |
*/10 * * * * /home/usuario/scripts/monitor.sh >> /home/usuario/logs/monitor.log 2>&10 3 * * * /home/usuario/scripts/copia.shProblemas habituales
Section titled “Problemas habituales”- El entorno de cron es mínimo:
PATHreducido y sin variables de la sesión. Se usan rutas absolutas o se definePATHal inicio del crontab. - Hay que redirigir la salida (
>> log 2>&1); si no, cron intenta enviarla por correo. - El script debe tener permiso de ejecución y shebang correcto.
- Los
%en la línea de cron se interpretan como saltos de línea; se escapan como\%. - Para depurar:
grep CRON /var/log/syslog(ojournalctl -u cron).
Para ejecutar una tarea una sola vez.
echo "/home/usuario/scripts/tarea.sh" | at 23:00echo "reboot" | sudo at now + 1 hourat -f tarea.sh tomorrow 09:00atq # tareas pendientesatrm 3 # eliminar la tarea 3Servicios y timers con systemd
Section titled “Servicios y timers con systemd”Alternativa moderna a cron, con registro integrado en el journal y gestión de dependencias.
Unidad de servicio
Section titled “Unidad de servicio”/etc/systemd/system/copia.service:
[Unit]Description=Copia de seguridad
[Service]Type=oneshotExecStart=/usr/local/bin/copia.shTimer asociado
Section titled “Timer asociado”/etc/systemd/system/copia.timer:
[Unit]Description=Ejecuta la copia cada día
[Timer]OnCalendar=dailyPersistent=true
[Install]WantedBy=timers.targetOnCalendardefine cuándo (daily,weekly,*-*-* 03:00:00,Mon..Fri 09:00).Persistent=trueejecuta la tarea al arrancar si se perdió una ejecución mientras el equipo estaba apagado.
Activar
Section titled “Activar”sudo systemctl daemon-reloadsudo systemctl enable --now copia.timersystemctl list-timerssystemctl status copia.timerServicio permanente
Section titled “Servicio permanente”Para un script que debe estar siempre en ejecución:
[Unit]Description=Mi servicioAfter=network.target
[Service]ExecStart=/usr/local/bin/servicio.shRestart=on-failureUser=usuario
[Install]WantedBy=multi-user.targetsudo systemctl enable --now servicio.servicesudo systemctl restart servicio.servicejournalctl -u servicio.service -f # ver el log en tiempo realjournalctl -u copia.service --since todaycron frente a systemd timers
Section titled “cron frente a systemd timers”| cron | systemd timer | |
|---|---|---|
| Configuración | Una línea | Dos ficheros de unidad |
| Logs | Manual (redirecciones) | journalctl |
| Ejecuciones perdidas | No se recuperan | Persistent=true |
| Dependencias y límites de recursos | No | Sí |
Copias de seguridad con rsync y tar
Section titled “Copias de seguridad con rsync y tar”tar -czf copia.tar.gz carpeta/ # crear (c), comprimir con gzip (z), fichero (f)tar -xzf copia.tar.gz # extraertar -xzf copia.tar.gz -C /destino # extraer en otro directoriotar -tzf copia.tar.gz # listar contenido sin extraertar -cjf copia.tar.bz2 carpeta/ # bzip2tar -cJf copia.tar.xz carpeta/ # xztar -czf copia.tar.gz --exclude='*.tmp' carpeta/Nombre con fecha:
tar -czf "copia_$(date +%Y%m%d_%H%M%S).tar.gz" carpeta/Sincroniza directorios copiando solo las diferencias.
rsync -avh origen/ destino/ # modo archivo, detallado, legiblersync -avh --delete origen/ destino/ # borra en destino lo que ya no está en origenrsync -avhn origen/ destino/ # -n: simulación, no hace cambiosrsync -avh --exclude='*.log' origen/ destino/rsync -avz -e ssh origen/ usuario@192.0.2.10:/copias/rsync -avh --progress origen/ destino/La barra final importa:
origen/copia el contenido del directorio.origencopia el directorio mismo dentro del destino.
Con --delete se recomienda ejecutar antes una simulación con -n.
Rotación de copias
Section titled “Rotación de copias”Conservar solo las N más recientes:
retencion=7ls -1t /copias/copia_*.tar.gz | tail -n +$((retencion + 1)) | xargs -r rm --Verificar integridad
Section titled “Verificar integridad”sha256sum copia.tar.gz > copia.tar.gz.sha256sha256sum -c copia.tar.gz.sha256tar -tzf copia.tar.gz > /dev/null && echo "Archivo íntegro"Copias incrementales con enlaces duros
Section titled “Copias incrementales con enlaces duros”rsync -a --link-dest=/copias/anterior /datos/ "/copias/$(date +%F)/"Cada copia aparece completa, pero los ficheros sin cambios comparten espacio en disco con la anterior.