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 remoto
  • lls: Listar el contenido del directorio local
  • cd directorio_remoto: Cambiar de directorio remoto
  • lcd directorio_local: Cambiar de directorio local
  • get archivo_remoto: Descargar un archivo
  • put archivo_local: Subir un archivo
  • mget archivos_remotos: Descargar múltiples archivos (comodines admitidos)
  • mput archivos_locales: Subir múltiples archivos (comodines admitidos)
  • exit o bye: 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_keys tenga chmod 600 y ~/.ssh tenga chmod 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, -vv o -vvv con ssh para 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.