Ich möchte den SSH-Agenten ausführen (mit der Option für maximale Lebensdauer), aber keine Schlüssel beim Start hinzufügen, sondern sie bei Bedarf hinzufügen.
Wenn ich mich beispielsweise zum ersten Mal bei einem Server anmelde, sollte ich nach einer Passphrase gefragt werden. Beim nächsten Mal (sofern ich nicht länger als eine Stunde gewartet habe) sollte eine saubere Verbindung hergestellt werden:
ssh server1
Enter passphrase for key '/home/vi/.ssh/id_dsa':
server1> ...
ssh server2
server2> # no passphrase this time
# wait for lifetime
ssh server2
Enter passphrase for key '/home/vi/.ssh/id_dsa':
Ich möchte nicht jedes Mal manuell daran denken müssen, „ssh-add“ auszuführen. (Zum Beispiel habe ich die Passphrase nur für SSH eingegeben und „Oh, es hat sie nicht gemerkt, muss sie erneut eingeben“).
Wie konfiguriere ich SSH, um dem SSH-Agenten automatisch einen Schlüssel hinzuzufügen, wenn der Benutzer die Passphrase eingegeben hat?
Antwort1
ssh unterstützt das Hinzufügen eines Schlüssels zum Agenten bei der ersten Verwendung (seit Version 7.2). Sie können diese Funktion aktivieren, indem Sie Folgendes eingeben ~/.ssh/config
:
AddKeysToAgent yes
Dies funktioniert auch beim Einsatz abgeleiteter Tools, wie etwa Git.
Von dem7.2 Änderungsprotokoll:
- ssh(1): Fügen Sie eine AddKeysToAgent-Clientoption hinzu, die auf „yes“, „no“, „ask“ oder „confirm“ gesetzt werden kann und standardmäßig auf „no“ eingestellt ist. Wenn aktiviert, wird ein privater Schlüssel, der während der Authentifizierung verwendet wird, dem ssh-agent hinzugefügt, wenn dieser ausgeführt wird (mit aktivierter Bestätigung, wenn auf „confirm“ eingestellt).
Antwort2
Sie könnten schummeln und etwas wie alias ssh='ssh-add -l || ssh-add && ssh'
auf Ihr .bashrc
/ setzen .profile
. Dies führt zuerst aus ssh-add -l
, was 0 (es gibt Schlüssel auf dem Agenten), 1 (keine Schlüssel) oder 2 (kein laufender Agent) zurückgeben kann; wenn es 0 zurückgibt, ssh
wird es ausgeführt; wenn 1, ssh-add
wird es ausgeführt und dann ssh
; wenn 2, ssh-add
schlägt es fehl und ssh
wird nicht ausgeführt. Ersetzen Sie das &&
durch ;
, wenn Sie ssh
es ausführen möchten, auch wenn kein Agent läuft.
Antwort3
Bis auto-call-ssh-add von ssh unterstützt wird, habe ich .bashrc
basierend auf dem Kovensky-Vorschlag Folgendes in mein hinzugefügt:
ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'
Der Alias wird nur erstellt, wenn die Identität nicht hinzugefügt wird, und der Alias zerstört sich selbst, sobald er ausgeführt wird.
Auf diese Weise wird der reguläre SSH-Befehl verwendet, nachdem die Identität hinzugefügt wurde.
Antwort4
Ich verwende die folgende Shell-Funktion:
ssh() {
local possible_keys=($(/usr/bin/env ssh -G $@ | grep '^identityfile' \
| cut -d " " -f 2- | sed -e "s|^~|$HOME|"))
for k in $possible_keys; do
if [[ -f $k ]]; then
local fingerprint=$(ssh-keygen -lf $k)
ssh-add -l | grep -q "$fingerprint" || ssh-add $k
fi
done
/usr/bin/env ssh $@
return $?
}
Zuerst löst es die Konfiguration für den Host auf, mit dem ich eine Verbindung herstellen möchte, fügt dann mögliche Schlüssel für diesen Host zum SSH-Agenten hinzu, falls sie noch nicht hinzugefügt wurden, und stellt schließlich eine Verbindung zum Host her. Ich bin sicher, dass es verbessert werden kann, also bin ich offen für Feedback.