Comandos Esenciales de SSH para Administradores de Sistemas
Aprende comandos esenciales de SSH para inicio de sesión remoto, claves, archivos de configuración, transferencia de archivos, túneles, agentes y resolución de problemas.
Comandos Esenciales de SSH para Administradores de Sistemas
Secure Shell (SSH) es la herramienta diaria de acceso remoto para servidores y dispositivos de red. Si gestionas sistemas Linux, usas comandos SSH para iniciar sesión, copiar archivos, ejecutar comandos puntuales, abrir túneles y depurar fallos de conexión.
Esta guía se centra en los comandos y opciones que probablemente necesitarás durante el trabajo de administración real.
Estableciendo Conexiones SSH Básicas
El uso más fundamental de SSH es establecer una sesión de shell interactiva y segura con un servidor remoto. La sintaxis básica es sencilla, permitiéndote especificar el usuario y el host de destino.
Conectándose a un Servidor Remoto
Para conectarte a un servidor remoto usando tu nombre de usuario local actual:
ssh nombre_host_o_dirección_IP
Si tu nombre de usuario en el servidor remoto es diferente de tu nombre de usuario local, debes especificarlo:
ssh nombre_usuario@nombre_host_o_dirección_IP
Ejemplo:
ssh [email protected]
ssh [email protected]
Especificando un Puerto Personalizado
Por defecto, SSH usa el puerto 22. Sin embargo, por razones de seguridad o configuraciones de red específicas, los servidores a menudo escuchan en un puerto diferente. Puedes especificar un puerto personalizado usando la bandera -p:
ssh -p 2222 nombre_usuario@nombre_host_o_dirección_IP
Consejo: Cambiar el puerto SSH predeterminado (puerto 22) es una práctica de seguridad común para reducir los intentos de ataque automatizados, aunque no reemplaza una autenticación sólida.
Autenticación Basada en Claves SSH
Si bien la autenticación por contraseña es común, la autenticación basada en claves es el método recomendado y más seguro para SSH. Utiliza un par de claves criptográficas: una clave privada (que se mantiene en secreto en tu máquina local) y una clave pública (que se coloca en el servidor remoto).
Generando Pares de Claves SSH
Usa ssh-keygen para generar un nuevo par de claves. Para la mayoría de las configuraciones modernas de OpenSSH, las claves Ed25519 son una buena opción predeterminada. Usa RSA solo cuando necesites compatibilidad con sistemas antiguos o políticas que lo requieran.
ssh-keygen -t ed25519 -a 100
Este comando genera un par de claves Ed25519 y aumenta las rondas de derivación de claves utilizadas para proteger la frase de contraseña de la clave privada. La clave privada (id_ed25519) y la clave pública (id_ed25519.pub) generalmente se almacenan en ~/.ssh/.
Copiando tu Clave Pública a un Servidor Remoto
Para habilitar la autenticación basada en claves, tu clave pública debe colocarse en el archivo ~/.ssh/authorized_keys en el servidor remoto. La utilidad ssh-copy-id automatiza este proceso:
ssh-copy-id nombre_usuario@nombre_host_o_dirección_IP
Este comando te pedirá la contraseña del usuario remoto una vez, luego copiará tu clave pública y establecerá los permisos correctos. Después de esto, deberías poder conectarte sin contraseña (aunque se te pedirá la frase de contraseña de tu clave privada si configuraste una).
Advertencia: Nunca compartas tu clave privada con nadie. Debe tener permisos de archivo estrictos, como chmod 600 ~/.ssh/id_ed25519.
Gestionando Conexiones y Configuraciones SSH
Ejecutando un Solo Comando de Forma Remota
SSH no es solo para shells interactivas. Puedes ejecutar un solo comando en un servidor remoto directamente y devolver su salida a tu terminal local.
ssh nombre_usuario@nombre_host_o_dirección_IP 'comando_a_ejecutar'
Ejemplo:
ssh [email protected] 'ls -l /var/log/'
ssh [email protected] 'sudo apt update && sudo apt upgrade -y'
Usando el Archivo de Configuración SSH (~/.ssh/config)
Para conexiones frecuentes, definir hosts en ~/.ssh/config puede ahorrar tiempo y simplificar los comandos. Este archivo te permite establecer alias, especificar usuarios, puertos, claves privadas y otras opciones de conexión.
Ejemplo de entrada ~/.ssh/config:
Host servidorweb
Hostname 192.168.1.100
User admin
Port 2222
IdentityFile ~/.ssh/id_rsa_web
IdentitiesOnly yes
Host cajadesarrollo
Hostname dev.midominio.com
User developer
Port 22
IdentityFile ~/.ssh/id_rsa_dev
Una vez configurado, puedes conectarte simplemente usando el alias:
ssh servidorweb
ssh cajadesarrollo
Mejor Práctica: Usa el archivo ~/.ssh/config para conexiones repetidas. Mejora la legibilidad, reduce los errores de escritura y mantiene las opciones de conexión en un solo lugar. Evita habilitar el reenvío de agente globalmente; actívalo solo para los hosts que realmente lo necesiten.
Transferencia Segura de Archivos con SSH
SSH proporciona dos herramientas principales para transferencias seguras de archivos: scp y sftp.
scp (Protocolo de Copia Segura)
scp se utiliza para copiar archivos y directorios entre hosts locales y remotos. Utiliza los mismos mecanismos de autenticación y seguridad que SSH.
Copiando un Archivo de Local a Remoto
scp /ruta/al/archivo/local nombre_usuario@nombre_host_o_dirección_IP:/ruta/al/directorio/remoto/
Ejemplo:
scp mi_app.tar.gz admin@servidorweb:/var/www/html/
Copiando un Archivo de Remoto a Local
scp nombre_usuario@nombre_host_o_dirección_IP:/ruta/al/archivo/remoto /ruta/al/directorio/local/
Ejemplo:
scp admin@servidorweb:/var/log/nginx/access.log ~/logs/
Copiando un Directorio de Forma Recursiva
Usa la bandera -r para directorios:
scp -r /ruta/al/directorio/local nombre_usuario@nombre_host_o_dirección_IP:/ruta/al/directorio_padre/remoto/
Preservando Atributos de Archivo
Para preservar los tiempos de modificación, tiempos de acceso y modos, usa la bandera -p:
scp -p archivo_local usuario@hostremoto:/ruta_remota/
sftp (Protocolo de Transferencia de Archivos SSH)
sftp proporciona un programa interactivo de transferencia de archivos, similar a FTP pero asegurado por SSH. Es ideal para gestionar múltiples archivos o realizar operaciones complejas de directorios.
Conectándose a un Servidor SFTP
sftp nombre_usuario@nombre_host_o_dirección_IP
Una vez conectado, obtendrás un prompt sftp>. Los comandos comunes incluyen:
ls: Listar el contenido del directorio remotolls: Listar el contenido del directorio localcd directorio_remoto: Cambiar de directorio remotolcd directorio_local: Cambiar de directorio localget archivo_remoto: Descargar un archivoput archivo_local: Subir un archivomget archivos_remotos: Descargar múltiples archivos (comodines admitidos)mput archivos_locales: Subir múltiples archivos (comodines admitidos)exitobye: Salir de la sesión SFTP
Ejemplo de Sesión SFTP:
sftp [email protected]
Connected to 192.168.1.100.
sftp> ls
config.ini data/ logs/ public_html/
sftp> cd public_html
sftp> get index.html
Fetching /public_html/index.html to index.html
sftp> put new_page.html
Uploading new_page.html to /public_html/new_page.html
sftp> bye
Tunelización SSH y Reenvío de Puertos
La tunelización SSH, o reenvío de puertos, te permite crear conexiones seguras entre puertos locales y remotos, habilitando el acceso a servicios que de otro modo podrían estar bloqueados por firewalls o ser inaccesibles directamente.
Reenvío de Puertos Local (-L)
El reenvío local te permite acceder a un servicio en una red remota (o en el propio servidor remoto) desde tu máquina local como si se estuviera ejecutando localmente.
ssh -L [puerto_local]:[host_remoto]:[puerto_remoto] nombre_usuario@servidor_ssh
Ejemplo: Acceder a un servidor de base de datos (puerto 3306) en una red privada, a través de un host de salto servidor_ssh, desde el puerto 9000 de tu máquina local.
ssh -L 9000:db.redprivada.net:3306 [email protected]
Ahora, puedes conectarte a localhost:9000 en tu máquina local, y la conexión se reenviará de forma segura a db.redprivada.net:3306 a través de hostsalto.com.
Reenvío de Puertos Remoto (-R)
El reenvío remoto hace que un servicio en tu máquina local (o red local) sea accesible desde el servidor remoto, y potencialmente para los clientes en la red del servidor remoto.
ssh -R [puerto_remoto]:[host_local]:[puerto_local] nombre_usuario@servidor_ssh
Ejemplo: Hacer que un servidor web local (puerto 8000) sea accesible desde servidor_ssh en el puerto 8080.
ssh -R 8080:localhost:8000 admin@servidor_remoto.com
Ahora, cualquiera en servidor_remoto.com puede acceder a tu servidor web local conectándose a localhost:8080 en servidor_remoto.com.
Reenvío de Puertos Dinámico (-D)
El reenvío dinámico de puertos crea un proxy SOCKS, permitiéndote enrutar todo tu tráfico (o el tráfico específico de una aplicación) a través del túnel SSH. Esto es útil para evitar firewalls o asegurar la navegación.
ssh -D [puerto_local] nombre_usuario@servidor_ssh
Ejemplo: Crear un proxy SOCKS en el puerto 1080 de tu máquina local a través de servidor_ssh.
ssh -D 1080 [email protected]
Configura tu navegador o aplicación para usar localhost:1080 como un proxy SOCKS5, y todo su tráfico de red se tunelizará a través de hostsalto.com.
Uso Avanzado de SSH y Consejos
Ejecutando Comandos en Segundo Plano
Para comandos no interactivos que deben ejecutarse y desconectarse, puedes usar la bandera -f (pasa a segundo plano antes de la ejecución del comando) y -N (no ejecuta un comando remoto).
ssh -f -N -L 9000:db.redprivada.net:3306 [email protected]
Esto configura un reenvío de puerto local en segundo plano.
Agente SSH y ssh-add
El ssh-agent es un programa que mantiene tus claves privadas en la memoria, por lo que solo necesitas ingresar tu frase de contraseña una vez por sesión. ssh-add agrega claves al agente.
# Iniciar el agente (si aún no se está ejecutando)
eval "$(ssh-agent -s)"
# Agregar tu(s) clave(s) al agente
ssh-add ~/.ssh/id_ed25519
ssh-add ~/.ssh/id_ed25519_web # Para una clave específica
El reenvío de agente puede permitirte autenticarte desde un host de salto a otro servidor sin copiar tu clave privada al host de salto. Úsalo con moderación: un host de salto comprometido podría usar tu agente reenviado mientras tu sesión está activa. Prefiere ProxyJump cuando solo necesites pasar a través de un bastión.
ssh -J [email protected] [email protected]
Conexiones SSH Persistentes (ControlMaster)
Para conexiones más rápidas y una sobrecarga reducida, ControlMaster en tu ~/.ssh/config permite que múltiples sesiones SSH compartan una única conexión de red.
Host *
ControlMaster auto
ControlPath ~/.ssh/control/%C
ControlPersist 4h
Esta configuración crea un socket de control para la primera conexión (ControlMaster auto) y las conexiones subsiguientes al mismo host reutilizarán este socket hasta por 4 horas (ControlPersist 4h).
Solución de Problemas de SSH
- Permiso Denegado: Verifica los permisos de archivo para las claves privadas (
chmod 600 ~/.ssh/id_ed25519), claves públicas (chmod 644 ~/.ssh/id_ed25519.pub) y el directorio.ssh(chmod 700 ~/.ssh). En el servidor, asegúrate de que~/.ssh/authorized_keystengachmod 600y~/.sshtengachmod 700. - Tiempo de Conexión Agotado: El servidor podría estar caído, el firewall bloqueando el puerto 22 (o el puerto personalizado), o la dirección IP es incorrecta.
- Salida Detallada: Usa las banderas
-v,-vvo-vvvconsshpara obtener información de depuración detallada.ssh -vvv [email protected]
Conclusión
Mantén tu flujo de trabajo diario de SSH simple: usa autenticación basada en claves, almacena opciones repetidas en ~/.ssh/config, copia archivos con scp o sftp, y accede a servicios privados con -L, -R, -D o -J cuando sea necesario. Cuando una conexión falle, ssh -vvv suele ser la forma más rápida de ver si el problema es DNS, enrutamiento, autenticación o política del servidor.