Die Lösung unter Linux und macOS
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l
Die erste Zeile startet den Agent und setzt zwei Variablen in Ihrer aktuellen Shell. Die letzte Zeile listet die geladenen Schlüssel auf. In der Shell fish nutzen Sie eval (ssh-agent -c).
Diagnose
echo "$SSH_AUTH_SOCK"
ssh-add -l
echo $?
| Exit-Status und Text | Bedeutung |
|---|---|
| 0, listet Schlüssel auf | Der Agent funktioniert und hat Schlüssel |
1, The agent has no identities. | Der Agent funktioniert und ist leer. Führen Sie ssh-add aus |
2, Could not open a connection to your authentication agent. | SSH_AUTH_SOCK ist nicht gesetzt oder leer |
2, Error connecting to agent: No such file or directory | Die Variable zeigt auf einen Socket, den es nicht mehr gibt |
Häufige Gründe
Sie haben ssh-agent ohne eval ausgeführt
Für sich allein gestartet, startet ssh-agent einen Hintergrundprozess und gibt Shell-Befehle aus. Nichts führt sie aus, Ihre Shell erfährt also nichts, und der Fehler bleibt:
$ 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.
Jeder solche Versuch lässt außerdem einen ungenutzten Agent laufen. pgrep -l ssh-agent listet sie auf, und die überzähligen können Sie mit kill beenden.
Eine neue Shell, tmux, cron oder sudo
Die Variablen existieren nur in der Shell, in der Sie eval ausgeführt haben, und in den Programmen, die sie startet. Ein anderes Terminal, ein Cronjob oder eine bestehende tmux-Sitzung hat sie nicht. sudo entfernt sie meistens.
Um einen Agent aus mehreren Shells wiederzuverwenden, geben Sie ihm einen festen Socket-Pfad:
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")"; }
Das kann in ~/.bashrc oder ~/.zshrc. Es startet nur dann einen Agent, wenn auf diesem Socket keiner antwortet. Viele Linux-Desktops und macOS starten bei der Anmeldung schon einen Agent, prüfen Sie also zuerst echo "$SSH_AUTH_SOCK" in einem frischen Terminal. Auf einem Mac siehe ssh-agent und der macOS-Schlüsselbund.
Ein veralteter Socket
Ältere Shells behalten den alten Pfad, nachdem der Agent gestoppt wurde, oder eine wieder verbundene tmux-Sitzung behält einen aus einer früheren Anmeldung:
ls -l "$SSH_AUTH_SOCK"
Ist die Datei weg, starten Sie wie oben gezeigt einen neuen Agent oder setzen in tmux die Variable aus einer neuen Shell erneut.
Sie sind auf einem Server und erwarten den Agent Ihres Laptops
Ohne Agent Forwarding hat eine Anmeldung auf einem Server keinen Agent, und diese Meldung ist dort normal. Wollen Sie einen Schlüssel auf dem Server nutzen, starten Sie dort einen Agent. Lesen Sie für Agent Forwarding zuerst seine Risiken, denn jeder mit Root auf diesem Server kann Ihre weitergeleiteten Schlüssel nutzen, solange Sie verbunden sind.
Windows
Windows betreibt den Agent als Dienst, und er ist standardmäßig deaktiviert. PowerShell braucht kein eval. In einer PowerShell mit Administratorrechten:
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
Get-Service ssh-agent
Die letzte Zeile sollte Running zeigen. Dann, in einer normalen PowerShell:
ssh-add $env:USERPROFILE\.ssh\id_ed25519
In Git Bash nehmen Sie stattdessen die Befehle oben auf dieser Seite. Sie starten den Agent, der mit Git kommt, getrennt vom Windows-Dienst.
Brauchen Sie den Agent?
Nicht immer. SSH verwendet Schlüsseldateien direkt und fragt nur jedes Mal nach einer Passphrase. Um einen Schlüssel bei der ersten Verwendung automatisch in einen Agent zu laden, fügen Sie dies zu ~/.ssh/config hinzu:
Host *
AddKeysToAgent yes
Fragen
Warum funktioniert ssh-add in einem Terminal und im anderen nicht?
Die Variablen des Agents gibt es nur in der Shell, in der Sie eval ausgeführt haben, und in den Programmen, die sie startet. Starten Sie den Agent aus ~/.bashrc oder ~/.zshrc mit einem festen Socket, oder nutzen Sie den Agent, den Ihr Desktop bei der Anmeldung startet.
Brauche ich ssh-agent, um SSH-Schlüssel zu nutzen?
Nein. ssh liest Schlüsseldateien direkt und fragt jedes Mal nach der Passphrase. Der Agent hält nur entsperrte Schlüssel im Speicher, damit Sie die Passphrase einmal eingeben.
Wie starte ich ssh-agent unter Windows?
Stellen Sie in einer PowerShell als Administrator den Dienst ssh-agent auf Automatisch und starten Sie ihn. In Git Bash führen Sie wie unter Linux eval "$(ssh-agent -s)" aus.
Quellen
- ssh-agent(1), OpenBSD-Handbuch
- ssh-add(1), OpenBSD-Handbuch
- Schlüsselbasierte Authentifizierung in OpenSSH für Windows, Microsoft