SSH cliente: ssh, ssh-keygen, ssh-copy-id, ~/.ssh/config
Introducción
SSH (Secure Shell) es el protocolo estándar para administrar sistemas remotos de forma segura. Cifra todo el tráfico y soporta autenticación por contraseña o por par de claves criptográficas. La autenticación por clave es más segura y cómoda que la contraseña.
Conexión básica con ssh
# Conectar como el mismo usuario del sistema local
ssh servidor.ejemplo.com
# Conectar como usuario específico
ssh usuario@servidor.ejemplo.com
# Puerto diferente al estándar (22)
ssh -p 2222 usuario@servidor.ejemplo.com
# Usar una clave privada específica
ssh -i ~/.ssh/mi_clave usuario@servidor.ejemplo.com
# Ejecutar un comando remoto sin abrir sesión interactiva
ssh usuario@servidor "df -h"
ssh usuario@servidor "uptime; free -h"
# Pseudo-terminal forzada (necesaria para comandos interactivos)
ssh -t usuario@servidor "sudo bash"
# Verbose para depurar problemas de conexión
ssh -v usuario@servidor
ssh -vv usuario@servidor # más detalle
ssh-keygen — Generar par de claves
La autenticación por clave usa criptografía asimétrica: la clave privada se queda en el cliente (protegida con passphrase) y la clave pública se instala en el servidor.
# Generar clave Ed25519 (recomendado, más corta y segura que RSA)
ssh-keygen -t ed25519 -C "usuario@equipo"
# Generar clave RSA de 4096 bits (compatible con sistemas más antiguos)
ssh-keygen -t rsa -b 4096 -C "usuario@equipo"
# Especificar fichero de salida (por defecto: ~/.ssh/id_ed25519)
ssh-keygen -t ed25519 -f ~/.ssh/clave_servidor_web
# Cambiar passphrase de una clave existente
ssh-keygen -p -f ~/.ssh/id_ed25519
# Ver la huella digital (fingerprint) de una clave
ssh-keygen -l -f ~/.ssh/id_ed25519
# Ver la clave pública a partir de la privada
ssh-keygen -y -f ~/.ssh/id_ed25519
Estructura de ficheros generados:
~/.ssh/id_ed25519— clave privada (permisos 600, nunca compartir)~/.ssh/id_ed25519.pub— clave pública (se copia al servidor)
ssh-copy-id — Instalar la clave pública en el servidor
# Copiar la clave pública por defecto al servidor
ssh-copy-id usuario@servidor.ejemplo.com
# Copiar una clave específica
ssh-copy-id -i ~/.ssh/clave_servidor_web.pub usuario@servidor.ejemplo.com
# Si el servidor usa puerto diferente
ssh-copy-id -p 2222 usuario@servidor.ejemplo.com
# Equivalente manual (cuando ssh-copy-id no está disponible)
cat ~/.ssh/id_ed25519.pub | ssh usuario@servidor "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Permisos requeridos en el servidor:
# El directorio .ssh debe tener permisos 700
chmod 700 ~/.ssh
# El fichero authorized_keys debe tener permisos 600
chmod 600 ~/.ssh/authorized_keys
# Si los permisos son incorrectos, SSH ignora las claves autorizadas
~/.ssh/config — Configuración del cliente
El fichero ~/.ssh/config permite definir alias y opciones por servidor, evitando escribir flags en
cada conexión.
# ~/.ssh/config
# Alias "web" para conectar a servidor de producción
Host web
HostName 192.168.1.100
User administrador
Port 2222
IdentityFile ~/.ssh/clave_web
# Servidor de base de datos
Host db
HostName db.intranet.local
User dba
IdentityFile ~/.ssh/clave_db
ServerAliveInterval 60 # keepalive cada 60 s
ServerAliveCountMax 3
# Todos los servidores de la intranet
Host *.intranet.local
User admin
IdentityFile ~/.ssh/clave_intranet
# Opciones globales para todas las conexiones
Host *
ServerAliveInterval 120
AddKeysToAgent yes
IdentitiesOnly yes
Con este fichero basta escribir ssh web en lugar de
ssh -p 2222 -i ~/.ssh/clave_web administrador@192.168.1.100.
Transferencia de ficheros
# scp — copiar fichero al servidor
scp fichero.txt usuario@servidor:/ruta/destino/
# scp — copiar directorio completo
scp -r directorio/ usuario@servidor:/ruta/destino/
# scp — descargar desde servidor
scp usuario@servidor:/ruta/fichero.txt .
# sftp — sesión interactiva
sftp usuario@servidor
# Dentro de sftp: put fichero, get fichero, ls, cd, quit
# rsync sobre SSH (más eficiente para sincronización)
rsync -avz --progress ficheros/ usuario@servidor:/ruta/destino/
rsync -avz -e "ssh -p 2222" ficheros/ usuario@servidor:/ruta/
SSH tunneling (reenvío de puertos)
# Reenvío local (-L): acceder a un servicio remoto como si fuera local
# Acceder a la web interna del servidor como localhost:8080
ssh -L 8080:localhost:80 usuario@servidor
# Ahora http://localhost:8080 apunta al puerto 80 del servidor
# Reenvío remoto (-R): exponer un servicio local en el servidor remoto
# Exponer el puerto 3000 local como puerto 9000 en el servidor
ssh -R 9000:localhost:3000 usuario@servidor
# Proxy SOCKS (-D): enrutar tráfico a través del servidor
ssh -D 1080 usuario@servidor
# Configurar el navegador para usar SOCKS5 en localhost:1080
# Sin abrir shell (solo el túnel)
ssh -N -L 5432:db-interno:5432 usuario@bastion
ssh-agent — Gestionar claves en memoria
# Iniciar el agente (normalmente ya está activo en el escritorio)
eval "$(ssh-agent -s)"
# Añadir la clave privada al agente (pide passphrase una sola vez)
ssh-add ~/.ssh/id_ed25519
# Añadir con tiempo de expiración (3600 segundos)
ssh-add -t 3600 ~/.ssh/id_ed25519
# Ver claves cargadas en el agente
ssh-add -l
# Eliminar todas las claves del agente
ssh-add -D
# Agent forwarding: usar las claves locales en conexiones encadenadas
ssh -A usuario@bastion
# Desde bastion se puede conectar a otros servidores usando las claves locales