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).
Los comandos principales, de un vistazo
| Comando | Para qué sirve | Ejemplo |
|---|---|---|
ssh | Entrar en otro equipo (o ejecutar ahí una orden) | ssh ana@servidor |
ssh-keygen | Crear tu pareja de claves | ssh-keygen -t ed25519 |
ssh-copy-id | Copiar tu clave pública al servidor | ssh-copy-id ana@servidor |
ssh-add | Darle tu clave al agente para no repetir la frase de paso | ssh-add |
scp | Copiar archivos entre equipos | scp notas.txt ana@servidor: |
sftp | Moverte por el servidor y subir o bajar archivos | sftp ana@servidor |
rsync | Sincronizar carpetas: solo copia lo que cambió | rsync -av proyecto/ ana@servidor:copia/ |
ssh -L | Abrir un túnel hacia un puerto del servidor | ssh -L 8080:localhost:8000 ana@servidor |
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í:
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
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 servidor | scp notas.txt ana@servidor: |
| subirlo a una carpeta concreta | scp notas.txt ana@servidor:/home/ana/ |
bajar un archivo a la carpeta actual (.) | scp ana@servidor:informes/octubre.txt . |
| subir una carpeta entera | scp -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_ed25519Desde 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
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 deauthorized_keysen 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 noen/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ónPermitRootLogindel mismo archivo lo controla.
Resumen
| Quiero… | Orden |
|---|---|
| entrar en un servidor | ssh ana@servidor |
| usar otro puerto | ssh -p 2222 ana@servidor |
| ejecutar una orden y volver | ssh ana@servidor 'orden' |
| crear mis claves | ssh-keygen -t ed25519 |
| instalar mi clave en el servidor | ssh-copy-id ana@servidor |
| no repetir la frase de paso | ssh-add |
| subir o bajar archivos | scp archivo ana@servidor: / scp ana@servidor:archivo . |
| navegar por el servidor | sftp ana@servidor |
| sincronizar una carpeta | rsync -av carpeta/ ana@servidor:carpeta/ |
| usar un puerto interno del servidor | ssh -L 8080:localhost:8000 ana@servidor |
| olvidar la huella de un servidor | ssh-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
