La soluzione su Linux e macOS
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l
La prima riga avvia l'agent e imposta due variabili nella tua shell attuale. L'ultima riga elenca le chiavi caricate. Nella shell fish usa eval (ssh-agent -c).
Diagnosi
echo "$SSH_AUTH_SOCK"
ssh-add -l
echo $?
| Stato di uscita e testo | Significato |
|---|---|
| 0, elenca le chiavi | L'agent funziona e ha delle chiavi |
1, The agent has no identities. | L'agent funziona ed è vuoto. Esegui ssh-add |
2, Could not open a connection to your authentication agent. | SSH_AUTH_SOCK non è impostata o è vuota |
2, Error connecting to agent: No such file or directory | La variabile punta a un socket che non esiste più |
Motivi comuni
Hai eseguito ssh-agent senza eval
Eseguito da solo, ssh-agent avvia un processo in background e stampa comandi per la shell. Nessuno li esegue, quindi la tua shell non impara nulla e l'errore resta:
$ 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.
Ogni tentativo di questo tipo lascia anche un agent inutilizzato in esecuzione. pgrep -l ssh-agent li elenca e puoi chiudere quelli in più con kill.
Una nuova shell, tmux, cron o sudo
Le variabili esistono solo nella shell dove hai eseguito eval e nei programmi che avvia. Un altro terminale, un job cron o una sessione tmux esistente non le hanno. sudo di solito le rimuove.
Per riusare un solo agent da più shell, dagli un percorso di socket fisso:
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")"; }
Può andare in ~/.bashrc o ~/.zshrc. Avvia un agent solo se nessuno risponde su quel socket. Molti desktop Linux e macOS avviano già un agent al login, quindi controlla prima echo "$SSH_AUTH_SOCK" in un terminale appena aperto. Su un Mac, vedi ssh-agent e il portachiavi di macOS.
Un socket obsoleto
Le shell più vecchie tengono il vecchio percorso dopo che l'agent si è fermato, oppure una sessione tmux ricollegata ne conserva uno di un login precedente:
ls -l "$SSH_AUTH_SOCK"
Se il file non c'è più, avvia un nuovo agent come mostrato sopra, oppure in tmux imposta di nuovo la variabile da una nuova shell.
Sei su un server e ti aspetti l'agent del tuo portatile
Senza agent forwarding, un login su un server non ha alcun agent, e lì questo messaggio è normale. Se vuoi una chiave sul server da usare, avvia lì un agent. Per l'agent forwarding, leggi prima i suoi rischi, perché chiunque abbia root su quel server può usare le tue chiavi inoltrate finché sei connesso.
Windows
Windows esegue l'agent come servizio, ed è disattivato per impostazione predefinita. In PowerShell eval non serve. In un PowerShell da amministratore:
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent
L'ultima riga dovrebbe mostrare Running. Poi, in un PowerShell normale:
ssh-add $env:USERPROFILE\.ssh\id_ed25519
In Git Bash, usa invece i comandi in cima a questa pagina. Avviano l'agent incluso in Git, separato dal servizio di Windows.
Ti serve l'agent?
Non sempre. SSH usa direttamente i file delle chiavi e chiede solo la passphrase ogni volta. Per caricare una chiave in un agent automaticamente al primo uso, aggiungi questo a ~/.ssh/config:
Host *
AddKeysToAgent yes
Domande
Perché ssh-add funziona in un terminale e non in un altro?
Le variabili dell'agente esistono solo nella shell dove hai eseguito eval e nei programmi che avvia. Avvia l'agente da ~/.bashrc o ~/.zshrc con un socket fisso, oppure usa l'agente che il desktop avvia all'accesso.
Serve ssh-agent per usare le chiavi SSH?
No. ssh legge direttamente i file delle chiavi e chiede la passphrase ogni volta. L'agente tiene solo in memoria le chiavi sbloccate, così la passphrase la scrivi una volta.
Come si avvia ssh-agent su Windows?
In un PowerShell da amministratore, imposta il servizio ssh-agent su Automatico e avvialo. In Git Bash esegui eval "$(ssh-agent -s)" come su Linux.
Fonti
- ssh-agent(1), manuale OpenBSD
- ssh-add(1), manuale OpenBSD
- Key-based authentication in OpenSSH for Windows, Microsoft