Qué es SSH y sus comandos principales, explicado para principiantes

SSH (Secure Shell) es la forma estándar de manejar otro ordenador a distancia desde tu terminal, como si estuvieras sentado delante: escribir órdenes, ver sus respuestas y copiar archivos. Todo viaja cifrado, así que nadie en el camino (el wifi del café, tu proveedor de internet) puede leer lo que escribes ni robarte la contraseña. Es la herramienta con la que se administra casi cualquier servidor, y también la que usa Git para hablar con GitHub o GitLab. Esta guía la explica desde cero, con esquemas y ejemplos reales.

Qué es SSH, en tres ideas

  • Es un protocolo, unas reglas para que dos equipos hablen de forma segura. Nació en 1995 para sustituir a Telnet y a rlogin, que mandaban todo, contraseñas incluidas, en texto legible.
  • Tiene dos partes. El cliente (ssh) está en tu equipo; el servidor (sshd) está en la máquina a la que te conectas y escucha, normalmente, en el puerto 22.
  • Casi seguro que ya lo tienes. Linux y macOS traen el cliente de OpenSSH, y Windows 10 y 11 también: abre una terminal o PowerShell y escribe ssh -V.
ssh -V
salida (en el equipo de las pruebas, con Debian 13)OpenSSH_10.0p2 Debian-7+deb13u4, OpenSSL 3.5.7 9 Jun 2026

Qué pasa cuando te conectas

Antes de dejarte escribir nada, el cliente y el servidor hacen cinco cosas. Las importantes para ti son dos: el servidor demuestra que es quien dice ser (con su huella) y tú demuestras quién eres (con tu contraseña o tu clave).

Qué pasa cuando escribes ssh ana@servidor cinco pasos en menos de un segundo; tú solo ves los pasos 2 (la primera vez) y 4 Tu equipo el cliente: ssh Guarda: · las huellas de los servidores conocidos (~/.ssh/known_hosts) · tu clave privada (~/.ssh/id_ed25519) El servidor el servicio: sshd Guarda: · su propia clave de servidor (su «DNI») · las claves públicas que dejan entrar (~/.ssh/authorized_keys) 1 Conexión al puerto 22 tu equipo llama a la puerta del servidor 2 El servidor se identifica enseña su huella; tu equipo la compara con known_hosts 3 Acuerdan un cifrado desde aquí, nadie en el camino puede leer ni cambiar nada 4 Te identificas con la contraseña de la cuenta o, mejor, con tu clave 5 Sesión cifrada órdenes, respuestas y archivos van por el mismo canal

Esquema: decodigo.com.

Los comandos principales, de un vistazo

ComandoPara qué sirveEjemplo
sshEntrar en otro equipo (o ejecutar ahí una orden)ssh ana@servidor
ssh-keygenCrear tu pareja de clavesssh-keygen -t ed25519
ssh-copy-idCopiar tu clave pública al servidorssh-copy-id ana@servidor
ssh-addDarle tu clave al agente para no repetir la frase de pasossh-add
scpCopiar archivos entre equiposscp notas.txt ana@servidor:
sftpMoverte por el servidor y subir o bajar archivossftp ana@servidor
rsyncSincronizar carpetas: solo copia lo que cambiórsync -av proyecto/ ana@servidor:copia/
ssh -LAbrir un túnel hacia un puerto del servidorssh -L 8080:localhost:8000 ana@servidor
Los ejemplos de esta guía son reales. Montamos dos equipos de prueba: portatil, desde el que se escriben las órdenes, y servidor, con una usuaria ana. En tu caso, cambia ana por tu usuario y servidor por el nombre o la IP de tu máquina (por ejemplo, ssh ana@203.0.113.10).

1. ssh: entrar en otro equipo

La forma básica es ssh usuario@equipo. La primera vez, SSH no conoce al servidor y te enseña su huella (fingerprint), un resumen de su clave, para que confirmes que es el correcto:

ssh ana@servidor
salida: primera conexión, con la contraseña de la cuentaThe authenticity of host 'servidor (172.23.0.2)' can't be established.
ED25519 key fingerprint is SHA256:mHTRrGjtb6A19IVRRgdjgBB76LRMnlnt0QBzFd8/jdE.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'servidor' (ED25519) to the list of known hosts.

ana@servidor's password:          ← aquí escribes la contraseña (no se ve)
ana@servidor:~$ hostname; whoami; pwd
servidor
ana
/home/ana
ana@servidor:~$ exit
logout
Connection to servidor closed.

Al responder yes, la huella se guarda en ~/.ssh/known_hosts y no se vuelve a preguntar. Lo correcto es comprobarla antes: quien administra el servidor puede verla con ssh-keygen -lf sobre la clave del servidor, y debe coincidir con la que te mostró SSH:

ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
salida, en el servidor: la misma huella SHA256:mHTR…256 SHA256:mHTRrGjtb6A19IVRRgdjgBB76LRMnlnt0QBzFd8/jdE root@buildkitsandbox (ED25519)

Para salir, escribe exit o pulsa Ctrl+D. Si solo quieres ejecutar una orden y volver, ponla al final, entre comillas; la salida aparece en tu terminal:

ssh ana@servidor 'ls -l informes; cat informes/octubre.txt'
salidatotal 4
-rw-r--r-- 1 ana ana 14 Oct 14 13:31 octubre.txt
ventas: 1,250

Si el servidor no usa el puerto 22, indícalo con -p (por ejemplo, ssh -p 2222 ana@servidor). Y si algo falla y no sabes por qué, ssh -v va contando cada paso de la conexión.

2. ssh-keygen y ssh-copy-id: entrar con clave

Con contraseña funciona, pero lo recomendable es usar una pareja de claves: es más seguro (no hay contraseña que adivinar) y más cómodo. Funciona así:

Entrar con clave en lugar de contraseña la pública es como un candado que dejas en el servidor; solo tu clave privada lo abre Tu equipo · ~/.ssh/ ssh-keygen -t ed25519 crea la pareja de claves id_ed25519 clave PRIVADA no sale de tu equipo permisos 600 id_ed25519.pub clave PÚBLICA se puede compartir sin ningún riesgo la frase de paso protege la privada si alguien te roba el archivo ssh-copy-id copia solo la .pub El servidor · /home/ana/.ssh/ authorized_keys una línea por cada clave pública que puede entrar en esta cuenta ssh-ed25519 AAAAC3Nz… ana@portatil Al conectarte, el servidor te reta y tu equipo lo resuelve con la privada, sin enviarla nunca

Esquema: decodigo.com.

Primero, crea las claves en tu equipo. Pulsa Intro para aceptar la ubicación y escribe una frase de paso: protege la clave privada si alguien te roba el archivo.

ssh-keygen -t ed25519 -C "ana@portatil"
salida (la frase de paso no se ve al escribirla)Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/ana/.ssh/id_ed25519): 
Enter passphrase for "/home/ana/.ssh/id_ed25519" (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ana/.ssh/id_ed25519
Your public key has been saved in /home/ana/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:z9hKEv6Uj1r2QNuJRD438V3CgFcZEs4cK7C5gkO8o+Y ana@portatil
The key's randomart image is:
+--[ED25519 256]--+
|        .  .=ooo |
|   .     +.+.*.  |
|    o   + o.= o .|
|   . o o . + . o |
|    = o S o . .  |
|   . + = % o     |
|  o   o @ *      |
| o     B *       |
|  E   ..+ o      |
+----[SHA256]-----+

-t ed25519 elige el tipo de clave moderno y recomendado, y -C añade un comentario para reconocerla. Se crean dos archivos; fíjate en los permisos: la privada solo la puede leer su dueña (-rw-------, es decir, 600).

ls -l ~/.ssh
salidatotal 16
-rw------- 1 ana ana 444 Oct 14 13:31 id_ed25519
-rw-r--r-- 1 ana ana  94 Oct 14 13:31 id_ed25519.pub
-rw------- 1 ana ana 978 Oct 14 13:31 known_hosts
-rw-r--r-- 1 ana ana 142 Oct 14 13:31 known_hosts.old
contenido de id_ed25519.pub: esta sí se puede compartirssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHbuGbHl+ZHQsWfjytQIQPVUuOoaIl5sNbMd1/S7MgyY ana@portatil

Después, copia la clave pública al servidor. ssh-copy-id te pide la contraseña de la cuenta una última vez y la añade al archivo authorized_keys del servidor:

ssh-copy-id ana@servidor
salida/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/ana/.ssh/id_ed25519.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

Number of key(s) added: 1

Now try logging into the machine, with: "ssh 'ana@servidor'"
and check to make sure that only the key(s) you wanted were added.
en el servidor: ~/.ssh/authorized_keys tiene la clave del portátiltotal 4
-rw------- 1 ana ana 94 Oct 14 13:31 authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHbuGbHl+ZHQsWfjytQIQPVUuOoaIl5sNbMd1/S7MgyY ana@portatil

Desde ahora, SSH ya no pide la contraseña de la cuenta, sino la frase de paso de tu clave, que nunca sale de tu equipo:

ssh ana@servidor 'echo Entré con la clave, sin la contraseña de la cuenta'
salidaEnter passphrase for key '/home/ana/.ssh/id_ed25519': 
Entré con la clave, sin la contraseña de la cuenta
¿Y en Windows? ssh y ssh-keygen funcionan igual en PowerShell, pero ssh-copy-id no viene incluido. Hay que añadir a mano el contenido de tu .pub como una línea nueva del archivo ~/.ssh/authorized_keys del servidor. Si el servidor está en un proveedor de nube, normalmente lo pegas en su panel al crear la máquina.

3. ssh-agent y ssh-add: la frase de paso, una sola vez

Escribir la frase de paso en cada conexión cansa. El agente la guarda en memoria mientras dure tu sesión: se la das una vez con ssh-add y ssh-add -l muestra qué claves tiene. En macOS y en la mayoría de escritorios Linux el agente ya está en marcha; en Windows es el servicio OpenSSH Authentication Agent.

ssh-add
ssh-add -l
salidaEnter passphrase for /home/ana/.ssh/id_ed25519: 
Identity added: /home/ana/.ssh/id_ed25519 (ana@portatil)
256 SHA256:z9hKEv6Uj1r2QNuJRD438V3CgFcZEs4cK7C5gkO8o+Y ana@portatil (ED25519)
ssh ana@servidor 'echo Hola desde $(hostname)'
salida: ya no pregunta nadaHola desde servidor

4. scp: copiar archivos

Funciona como cp, pero un lado (o los dos) puede ser otro equipo, escrito como usuario@equipo:ruta. Si la ruta va vacía, después de los dos puntos, se refiere a tu carpeta personal en el servidor. Los dos puntos son imprescindibles: sin ellos, scp crea una copia local llamada «ana@servidor».

Quiero…Orden
subir un archivo a mi carpeta del servidorscp notas.txt ana@servidor:
subirlo a una carpeta concretascp notas.txt ana@servidor:/home/ana/
bajar un archivo a la carpeta actual (.)scp ana@servidor:informes/octubre.txt .
subir una carpeta enterascp -r proyecto ana@servidor:
scp -r proyecto ana@servidor:
ssh ana@servidor 'ls -R proyecto'
salidaproyecto:
a.txt
b.txt

5. sftp: un explorador de archivos en la terminal

Si necesitas moverte por las carpetas antes de copiar, sftp abre una sesión con órdenes como las de un explorador de archivos: ls y cd en el servidor, lls y lcd en tu equipo, get para bajar, put para subir y bye para salir. Es también lo que usan por debajo programas gráficos como FileZilla o WinSCP cuando eliges «SFTP».

sftp ana@servidor
sesión de ejemplosftp> pwd
Remote working directory: /home/ana
sftp> ls
informes   notas.txt  proyecto   web        
sftp> cd informes
sftp> get octubre.txt informe-copia.txt
sftp> bye

6. rsync: sincronizar sin copiarlo todo otra vez

rsync no es parte de SSH, pero viaja por SSH y es la mejor opción para copias de seguridad o para subir una web: solo envía lo que ha cambiado. Tiene que estar instalado en los dos equipos. -a conserva permisos y fechas y -v enseña qué copia. La barra final en proyecto/ significa «el contenido de la carpeta».

rsync -av proyecto/ ana@servidor:copia-proyecto/
salidasending incremental file list
created directory copia-proyecto
./
a.txt
b.txt

sent 184 bytes  received 94 bytes  556.00 bytes/sec
total size is 4  speedup is 0.01

7. ~/.ssh/config: atajos para no repetir

Si te conectas a menudo, crea el archivo ~/.ssh/config en tu equipo y dale un nombre corto a cada servidor:

Host miserver
    HostName servidor
    User ana
    Port 22
    IdentityFile ~/.ssh/id_ed25519

Desde entonces, miserver vale por todo eso, también en scp, sftp y rsync:

ssh miserver 'echo Conectado como $(whoami) en $(hostname)'
salidaConectado como ana en servidor

8. ssh -L: abrir un túnel

Muchos servicios (un panel de administración, una base de datos) solo escuchan dentro del propio servidor, en localhost, para que nadie pueda llegar a ellos desde internet. Un túnel te deja usarlos de forma segura. En nuestra prueba, el servidor tiene una web interna en su puerto 8000; desde fuera no se puede abrir:

curl http://servidor:8000/
salidacurl: (7) Failed to connect to servidor port 8000 after 0 ms: Could not connect to server

Un túnel: ssh -L 8080:localhost:8000 miserver el panel del servidor solo escucha en su propio localhost; el túnel te deja usarlo como si estuvieras allí Tu equipo navegador o curl localhost:8080 la entrada del túnel conexión SSH cifrada, puerto 22 por fuera solo se ve una conexión SSH normal El servidor localhost:8000 el panel interno sshd la salida del túnel curl http://servidor:8000 → Could not connect

Esquema: decodigo.com, con la orden y las direcciones de la prueba.

Con -L 8080:localhost:8000 decimos: «lo que llegue al puerto 8080 de mi equipo, llévalo por SSH y entrégalo en el localhost:8000 del servidor». -N evita abrir una terminal remota y -f deja el túnel funcionando en segundo plano:

ssh -f -N -L 8080:localhost:8000 miserver
curl http://localhost:8080/
salida: la web interna, a través del túnel<h1>Panel interno del servidor</h1>

Los errores que más vas a ver

«Connection refused» o «Connection timed out»

No hay ningún SSH escuchando en ese puerto (refused) o algo bloquea el camino, como un cortafuegos (timed out). Comprueba la dirección, el puerto (-p) y que el servicio sshd esté en marcha en el servidor.

salida de ssh -p 2222 ana@servidorssh: connect to host servidor port 2222: Connection refused

«Permission denied (publickey,password)»

El servidor existe, pero no te deja entrar: el usuario no existe, la contraseña está mal o no tiene tu clave pública. Entre paréntesis dice qué métodos acepta. Revisa el usuario antes de la @.

salida de ssh pepe@servidor (pepe no existe)pepe@servidor: Permission denied (publickey,password).

«UNPROTECTED PRIVATE KEY FILE!»

Tu clave privada tiene permisos demasiado abiertos y SSH se niega a usarla. Pasa mucho al copiarla desde otro equipo. Se arregla con chmod 600 ~/.ssh/id_ed25519 (los permisos, explicados en los comandos de Linux que de verdad se usan).

salida con la clave en 644@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/ana/.ssh/id_ed25519' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/ana/.ssh/id_ed25519": bad permissions
ana@servidor: Permission denied (publickey,password).

«REMOTE HOST IDENTIFICATION HAS CHANGED!»

La huella del servidor no coincide con la que guardaste la primera vez. Puede ser inofensivo, porque se reinstaló el servidor o se regeneraron sus claves (es lo que hicimos en la prueba), o puede ser alguien haciéndose pasar por él. No lo ignores: confirma con quien administra el servidor que el cambio es legítimo.

salida@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:fP/72G46dYiH1vR5RAL5C+heoLz7boSzar7C5mdUeAc.
Please contact your system administrator.
Add correct host key in /home/ana/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/ana/.ssh/known_hosts:3
  remove with:
  ssh-keygen -f '/home/ana/.ssh/known_hosts' -R 'servidor'
Host key for servidor has changed and you have requested strict checking.
Host key verification failed.

Una vez confirmado, borra la huella vieja con ssh-keygen -R y vuelve a conectarte para aceptar la nueva:

ssh-keygen -R servidor
salida# Host servidor found: line 1
# Host servidor found: line 2
# Host servidor found: line 3
/home/ana/.ssh/known_hosts updated.
Original contents retained as /home/ana/.ssh/known_hosts.old

Cinco consejos de seguridad

  • Nunca compartas la clave privada (el archivo sin .pub). Si crees que alguien la tiene, borra su línea de authorized_keys en cada servidor y crea otra.
  • Ponle frase de paso y usa el agente para no tener que escribirla a cada rato.
  • Comprueba la huella la primera vez que te conectas a un servidor, y no aceptes sin más un aviso de huella cambiada.
  • En tus servidores, desactiva la entrada con contraseña cuando ya funcione la clave: PasswordAuthentication no en /etc/ssh/sshd_config. Antes, comprueba en otra terminal que entras con la clave para no quedarte fuera.
  • No entres como root. Entra con tu usuario y usa sudo; la opción PermitRootLogin del mismo archivo lo controla.

Resumen

Quiero…Orden
entrar en un servidorssh ana@servidor
usar otro puertossh -p 2222 ana@servidor
ejecutar una orden y volverssh ana@servidor 'orden'
crear mis clavesssh-keygen -t ed25519
instalar mi clave en el servidorssh-copy-id ana@servidor
no repetir la frase de pasossh-add
subir o bajar archivosscp archivo ana@servidor: / scp ana@servidor:archivo .
navegar por el servidorsftp ana@servidor
sincronizar una carpetarsync -av carpeta/ ana@servidor:carpeta/
usar un puerto interno del servidorssh -L 8080:localhost:8000 ana@servidor
olvidar la huella de un servidorssh-keygen -R servidor

Los ejemplos se ejecutaron el 14 de octubre de 2026 con OpenSSH 10.0p2 en dos contenedores desechables de Debian 13, uno como cliente y otro como servidor; las salidas están copiadas de esa ejecución. Las claves de los ejemplos se crearon solo para la prueba y ya no existen. Opciones y comportamiento según las páginas del manual de OpenSSH (ssh, ssh-keygen, ssh-copy-id, scp, sftp, ssh_config y sshd_config); el protocolo está definido en el RFC 4251 y siguientes.

Fuente: OpenSSH, manuales