Redes y SSH en Bash
SSH (Secure Shell) es el estándar para acceder a servidores remotos de forma segura.
Con Bash y herramientas complementarias como scp y rsync podemos automatizar operaciones remotas y transferencias de archivos.
1. Conectarse a un servidor remoto con ssh #
Sintaxis básica:
1ssh usuario@servidor
Ejemplo:
1ssh angel@192.168.1.10
👉 Pide la contraseña del usuario en el servidor remoto.
Ejecutar un comando remoto #
1ssh usuario@servidor "hostname && uptime"
👉 Ejecuta los comandos entre comillas en el servidor y muestra el resultado localmente.
2. Autenticación con clave pública #
Para no tener que introducir la contraseña cada vez:
- Genera un par de claves en tu máquina local:
1ssh-keygen -t ed25519 -C "tu_email@example.com"
- Se crea
~/.ssh/id_ed25519(clave privada) - y
~/.ssh/id_ed25519.pub(clave pública)
- Copia la clave pública al servidor:
1ssh-copy-id usuario@servidor
- Ahora podrás conectarte sin contraseña:
1ssh usuario@servidor
3. Configuración de ~/.ssh/config #
Para simplificar conexiones frecuentes:
1nano ~/.ssh/config
Ejemplo de configuración:
Host mi_servidor
HostName 203.0.113.10
User angel
IdentityFile ~/.ssh/id_ed25519
Port 22
👉 Con esto, puedes conectarte así:
1ssh mi_servidor
4. Transferir archivos con scp #
De local a remoto #
1scp archivo.txt usuario@servidor:/home/usuario/
De remoto a local #
1scp usuario@servidor:/home/usuario/archivo.txt .
👉 La opción -r copia carpetas completas:
1scp -r proyecto/ usuario@servidor:/var/www/
5. Sincronización avanzada con rsync sobre SSH #
rsync es más eficiente que scp porque solo transfiere los cambios.
Ejemplo: sincronizar un proyecto local con un servidor remoto:
1rsync -avz ./proyecto/ usuario@servidor:/var/www/proyecto
Opciones recomendadas:
-a→ modo archivo (mantiene permisos, fechas…)-v→ modo detallado-z→ comprime datos durante la transferencia--delete→ elimina en el destino archivos que no estén en el origen (¡cuidado!)
Simulación sin cambios reales:
1rsync -avz --dry-run ./proyecto/ usuario@servidor:/var/www/proyecto
6. Crear túneles SSH #
Los túneles permiten redirigir puertos para acceder a servicios remotos de forma segura.
Ejemplo: acceder a un servidor MySQL remoto (puerto 3306) a través de SSH:
1ssh -L 3307:localhost:3306 usuario@servidor
👉 Esto crea un túnel local en el puerto 3307 hacia el puerto 3306 del servidor.
7. Automatizar tareas remotas #
Ejemplo: script deploy.sh que:
- Comprima un proyecto local.
- Lo transfiera al servidor.
- Lo descomprima y reinicie el servicio remoto.
1#!/usr/bin/env bash 2set -Eeuo pipefail 3 4PROYECTO="miapp" 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..." 15ssh "$SERVIDOR" "tar -xzf /tmp/$PROYECTO.tar.gz -C $DESTINO && rm /tmp/$PROYECTO.tar.gz && sudo systemctl restart miapp" 16 17echo "Despliegue completado ✅"
8. Ejercicio práctico 1 #
Crea un script backup_remoto.sh que:
- Comprima la carpeta
/var/logen el servidor remoto. - Transfiera el backup al equipo local (en
~/backups). - Muestre el tamaño del archivo descargado.
9. Ejercicio práctico 2 #
Crea un script sync_web.sh que:
- Use
rsyncpara sincronizar la carpeta./sitio_weblocal con/var/www/htmlen el servidor remoto. - Use
--deletepara mantener ambas carpetas idénticas. - Genere un log de la sincronización con fecha y hora.
10. Ejercicio práctico 3 #
Crea un script monitorea_remoto.sh que:
- Use
sshpara conectarse a un servidor remoto. - Ejecute
uptimeydf -hen el servidor. - Guarde el resultado en
monitoreo_YYYYMMDD.txt.
11. Buenas prácticas #
- ✅ Usa autenticación con claves en vez de contraseñas.
- ✅ Protege tu clave privada con contraseña (
ssh-keygenlo permite). - ✅ Usa
rsync --dry-runantes de sincronizaciones destructivas. - ✅ Automatiza conexiones repetitivas con
~/.ssh/config. - ✅ Mantén copias de seguridad antes de despliegues.
Resumen del tema
Conceptos clave #
- Ejecución Remota con
ssh: envío de comandos remotos en una sola línea (ssh user@server "comando"). - Autenticación Asimétrica sin Contraseña: generación de pares con
ssh-keygen -t ed25519y propagación conssh-copy-id. - Perfiles de Conexión (
~/.ssh/config): simplificación de nombres de host, puertos no estándar y asignación de claves privadas mediante alias. - Transferencia Segura (
scpvsrsync):scp -r origen destino: copia recursiva directa.rsync -avz --delete origen destino: sincronización delta eficiente comprimida que reduce el tráfico de red.
- Túneles y Redirección de Puertos (
ssh -L local_port:host:remote_port): reenvío de puertos TCP locales hacia servicios internos restringidos.
Qué debes recordar #
Configura claves Ed25519 con ~/.ssh/config para automatizar scripts de despliegue y respaldos remotos rápidos y seguros mediante rsync -avz.