Curso de Shell Scripting
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.
12.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.
12.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
12.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
12.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/
12.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
12.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.
12.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 ✅"
🏋️♂️ 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.
🏋️♂️ 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.
🏋️♂️ 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.
✅ 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.
- Loading...