(Ich habe viele der Fragen auf dieser Website gelesen, die im Zusammenhang stehen, und ich glaube, dass dies eine wirklich neue Frage ist.)
Ich habe viele Schlüssel auf vielen Servern und sie sind alle mit Passphrasen geschützt.
Ich mag die Eingabe von Passwörtern genauso wie die Eingabe von Passwörtern - es ist ein echter Produktivitätsverlust.
ssh-agent + ssh-add- Befehle können in einer Login-Shell verwendet werden, um zu bedeuten, dass Sie Ihre Passphrase nur einmal bei der Anmeldung eingeben müssen
Der Schlüsselbund kann verwendet werden, um einen ssh-Agenten über das Abmelden hinaus am Leben zu halten. Sie müssen ihn beispielsweise beim Booten nur einmal eingeben, oder Sie können ihn eine Stunde lang am Leben halten.
Das Problem, das ich habe, ist, dass diese beiden Lösungen normalerweise bei einer Shell-Anmeldung initiiert werden (z. B. .zshrc
), wenn ich meine Passphrase beim Anmelden eingebe, auch wenn ich sie nicht entsperren muss. (Ich bin nicht zufrieden mit dem Schlüsselbund, der einen Agenten auf unbestimmte Zeit am Leben hält.)
Was ich möchte, ist, dass ich nur bei Bedarf zur Eingabe einer Passphrase (für einen Agenten) aufgefordert werde .
Ich kann mich also bei Server A anmelden, ein paar Dinge erledigen, dann bei Server B ssh und an diesem Punkt nach der Passphrase gefragt werden. Mach ein paar Sachen auf Server B, logge dich aus. Zurück auf A, mach noch ein paar Sachen, ssh wieder auf B und brauche meine Passphrase nicht (sie wird von einem Agenten gehalten).
Ich stelle fest, dass dies auf grafischen Desktops wie Gnome möglich ist - Sie werden in einem Popup-Fenster aufgefordert, die Passphrase einzugeben, um Ihren privaten Schlüssel zu entsperren, sobald Sie versuchen, ssh auszuführen. Das ist es, wonach ich aber von einer Konsole aus suche.
Antworten:
Fügen Sie nichts zu Ihren Shell-Startskripten hinzu, dies ist unnötiger Hacker.
Fügen Sie stattdessen hinzu
in deine .ssh / config
Auf diese Weise wird ssh-add automatisch ausgeführt, wenn Sie das erste Mal in eine andere Box ssh. Sie müssen Ihren Schlüssel nur erneut eingeben, wenn er von ssh-agent abläuft oder nachdem Sie neu gestartet haben.
quelle
Zsh hat einen
preexec
Hook, der eine Funktion ausführt, bevor ein in der Befehlszeile eingegebener Befehl ausgeführt wird. Hier ist ein Haken, derssh
in Ihrer Befehlszeile nach sucht und, falls er gefunden wird, nach einem ssh-Agenten sucht . Wenn das nicht gefunden wird, wird keychain ausgeführt.Auf diese Weise wird der Schlüsselbund nur vor ssh-Befehlen ausgeführt und nur dann, wenn dies erforderlich ist.
Fügen Sie dies in Ihre
~/.zshrc
:Was hier passiert, ist, wann immer ein Befehl eingegeben wird, der
check_ssh
aufgerufen wird, bevor der Befehl ausgeführt wird.Die erste Zeile der Funktion überprüft den erweiterten Befehl auf die
ssh
Verwendung einer Zsh-Regex.ssh
muss auf\b
beiden Seiten Wortgrenzen haben . Wird dies nicht gefunden, kehrt die Funktion zurück.In der nächsten Zeile wird überprüft, ob die Umgebungsvariable einen SSH-Agentenprozess enthält und ob dieser Prozess noch in der Prozesstabelle vorhanden ist. Anschließend wird überprüft, ob dem Agenten mindestens ein Schlüssel hinzugefügt wurde. Wenn das alles in Ordnung ist, ist der ssh-Agent eingerichtet und wir müssen nichts tun, sodass er zurückkehrt.
Schließlich starten wir den Schlüsselbund mit dem Agenten, der eine Stunde lang am Leben bleiben soll.
Es bleibt immer noch das Problem mit eingebettetem ssh-Zeug, wie
git
oderrsync
oder,scp
da dies die Funktion nicht auslöst (Sie könnten diese dem regulären Ausdruck hinzufügen).quelle
zsh
könnte man ein kurzes Skript mit dem gleichen Effekt erstellen und esPATH
vor dem eigentlichenssh
Client platzieren. Könnte sogar mitrsync
et al arbeiten, wenn sie lesen,PATH
anstatt/usr/bin/ssh
direkt zu laufen .Für zsh habe ich eine Reihe von Hilfsprogrammen und Wrappern geschrieben, um mehr oder weniger das zu tun, was Sie wollen: https://www.vinc17.net/unix/index.de.html#zsh-ssh-utils
Tatsächlich macht dies sogar noch mehr, da das
ssh-agent
von allen Anmeldesitzungen gemeinsam genutzt wird (Desktop oder über SSH, und GNU Screen wird auch unterstützt, wenn Sie von dort aus Anmeldeshells starten, z. B. mitshell -zsh
in der~/.screenrc
Datei), und es wird erst nach dem beendet Die letzte Sitzung wird beendet.Hinweis: Ich verwende nur eine Passphrase für alle meine Schlüssel. Ich bin mir nicht sicher, wie sich die verschiedenen Passphrasen verhalten. Möglicherweise müssen einige Änderungen vorgenommen werden.
quelle