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:

  1. 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)
  1. Copia la clave pública al servidor:
1ssh-copy-id usuario@servidor
  1. 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:

  1. Comprima un proyecto local.
  2. Lo transfiera al servidor.
  3. 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:

  1. Comprima la carpeta /var/log en el servidor remoto.
  2. Transfiera el backup al equipo local (en ~/backups).
  3. Muestre el tamaño del archivo descargado.

🏋️‍♂️ Ejercicio práctico 2

Crea un script sync_web.sh que:

  1. Use rsync para sincronizar la carpeta ./sitio_web local con /var/www/html en el servidor remoto.
  2. Use --delete para mantener ambas carpetas idénticas.
  3. Genere un log de la sincronización con fecha y hora.

🏋️‍♂️ Ejercicio práctico 3

Crea un script monitorea_remoto.sh que:

  1. Use ssh para conectarse a un servidor remoto.
  2. Ejecute uptime y df -h en el servidor.
  3. Guarde el resultado en monitoreo_YYYYMMDD.txt.

✅ Buenas prácticas

  1. ✅ Usa autenticación con claves en vez de contraseñas.
  2. ✅ Protege tu clave privada con contraseña (ssh-keygen lo permite).
  3. ✅ Usa rsync --dry-run antes de sincronizaciones destructivas.
  4. ✅ Automatiza conexiones repetitivas con ~/.ssh/config.
  5. ✅ Mantén copias de seguridad antes de despliegues.

  • Loading...