Wie kann man den SSH-Agent dazu bringen, den Schlüssel bei Bedarf automatisch hinzuzufügen?

Wie kann man den SSH-Agent dazu bringen, den Schlüssel bei Bedarf automatisch hinzuzufügen?

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, sshwird es ausgeführt; wenn 1, ssh-addwird es ausgeführt und dann ssh; wenn 2, ssh-addschlägt es fehl und sshwird nicht ausgeführt. Ersetzen Sie das &&durch ;, wenn Sie sshes ausführen möchten, auch wenn kein Agent läuft.

Antwort3

Bis auto-call-ssh-add von ssh unterstützt wird, habe ich .bashrcbasierend 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.

verwandte Informationen