La solución en Linux y macOS
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l
La primera línea inicia el agente y define dos variables en tu shell actual. La última línea lista las claves cargadas. En el shell fish, usa eval (ssh-agent -c).
Diagnóstico
echo "$SSH_AUTH_SOCK"
ssh-add -l
echo $?
| Código de salida y texto | Significado |
|---|---|
| 0, lista claves | El agente funciona y tiene claves |
1, The agent has no identities. | El agente funciona y está vacío. Ejecuta ssh-add |
2, Could not open a connection to your authentication agent. | SSH_AUTH_SOCK no está definida o está vacía |
2, Error connecting to agent: No such file or directory | La variable apunta a un socket que ya no existe |
Motivos habituales
Ejecutaste ssh-agent sin eval
Ejecutado solo, ssh-agent inicia un proceso en segundo plano y muestra comandos de shell. Nadie los ejecuta, así que tu shell no se entera de nada y el error persiste:
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-XXXXXX/agent.5467; export SSH_AUTH_SOCK;
SSH_AGENT_PID=5468; export SSH_AGENT_PID;
echo Agent pid 5468;
$ ssh-add -l
Could not open a connection to your authentication agent.
Cada intento así deja además un agente sin usar en marcha. pgrep -l ssh-agent los lista, y puedes terminar los sobrantes con kill.
Un shell nuevo, tmux, cron o sudo
Las variables solo existen en el shell donde ejecutaste eval y en los programas que este inicia. Otra terminal, una tarea de cron o una sesión de tmux existente no las tienen. sudo normalmente las elimina.
Para reutilizar un agente desde varios shells, dale una ruta de socket fija:
export SSH_AUTH_SOCK="$HOME/.ssh/agent.sock"
ssh-add -l >/dev/null 2>&1
[ $? -eq 2 ] && { rm -f "$SSH_AUTH_SOCK"; eval "$(ssh-agent -s -a "$SSH_AUTH_SOCK")"; }
Puede ir en ~/.bashrc o ~/.zshrc. Inicia un agente solo si ninguno responde en ese socket. Muchos escritorios Linux y macOS ya inician un agente al entrar en sesión, así que comprueba antes echo "$SSH_AUTH_SOCK" en una terminal recién abierta. En un Mac, consulta ssh-agent y el llavero de macOS.
Un socket obsoleto
Los shells antiguos conservan la ruta anterior después de que el agente se detiene, o una sesión de tmux reconectada conserva una de un inicio de sesión anterior:
ls -l "$SSH_AUTH_SOCK"
Si el archivo ya no existe, inicia un agente nuevo como se muestra arriba o, en tmux, vuelve a definir la variable desde un shell nuevo.
Estás en un servidor y esperas el agente de tu portátil
Sin agent forwarding, una sesión en un servidor no tiene agente, y este mensaje allí es normal. Si quieres una clave que usar en el servidor, inicia allí un agente. Para el agent forwarding, lee antes sus riesgos, porque cualquiera con root en ese servidor puede usar tus claves reenviadas mientras estés conectado.
Windows
Windows ejecuta el agente como un servicio, y viene desactivado por defecto. PowerShell no necesita eval. En un PowerShell de administrador:
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent
La última línea debería mostrar Running. Después, en un PowerShell normal:
ssh-add $env:USERPROFILE\.ssh\id_ed25519
En Git Bash, usa en cambio los comandos del principio de esta página. Inician el agente que trae Git, distinto del servicio de Windows.
¿Necesitas el agente?
No siempre. SSH usa directamente los archivos de clave, y solo pide la frase de contraseña cada vez. Para cargar una clave en un agente automáticamente la primera vez que se usa, añade esto a ~/.ssh/config:
Host *
AddKeysToAgent yes
Preguntas
¿Por qué ssh-add funciona en un terminal y no en otro?
Las variables del agente solo existen en el shell donde ejecutaste eval y en los programas que arranca. Inicia el agente desde ~/.bashrc o ~/.zshrc con un socket fijo, o usa el agente que tu escritorio arranca al iniciar sesión.
¿Hace falta ssh-agent para usar claves SSH?
No. ssh lee los archivos de claves directamente y pide la frase de contraseña cada vez. El agente solo guarda en memoria las claves desbloqueadas, para que escribas la frase una vez.
¿Cómo se inicia ssh-agent en Windows?
En un PowerShell de administrador, pon el servicio ssh-agent en Automático e inícialo. En Git Bash, ejecuta eval "$(ssh-agent -s)" como en Linux.
Fuentes
- ssh-agent(1), manual de OpenBSD
- ssh-add(1), manual de OpenBSD
- Autenticación con claves en OpenSSH para Windows, Microsoft