Also früher habe ich die oben beschriebenen Ansätze verwendet, aber irgendwie ziehe ich es vor, dass der Agent stirbt, wenn meine letzte BASH-Sitzung endet. Dies ist etwas länger als die anderen Lösungen, aber es ist mein bevorzugter Ansatz. Die grundlegende Idee ist, dass die erste BASH-Sitzung den SSH-Agenten startet. Dann überprüft jede zusätzliche BASH-Sitzung die Konfigurationsdatei (~/.ssh/.agent_env
). Wenn diese vorhanden ist und eine Sitzung läuft, dann wird die Umgebung geladen und ein Hardlink zur Socket-Datei in /tmp
erstellt (muss auf demselben Dateisystem wie die Original-Socket-Datei sein). Wenn BASH-Sitzungen heruntergefahren werden, löscht jede ihre eigenen Hardlinks. Die letzte Sitzung, die geschlossen wird, findet heraus, dass die Hardlinks 2 Verknüpfungen haben (den Hardlink und das Original), das Entfernen des eigenen Sockets des Prozesses und das Beenden des Prozesses führen zu 0 und hinterlassen nach dem Schließen der letzten BASH-Sitzung eine saubere Umgebung.
# Starte den SSH-Agenten, um angemeldet zu bleiben mit Schlüsseln, verwende `ssh-add` zum Einloggen
agent=`pgrep ssh-agent -u $USER` # nur deine Agenten finden
if [[ "$agent" == "" || ! -e ~/.ssh/.agent_env ]]; then
# Wenn keine Agenten vorhanden sind oder die Umgebungsdatei fehlt, eine neue erstellen
# alte Agenten/Umgebungsvariablen-Dateien entfernen
kill $agent Ausführung beendet
rm ~/.ssh/.agent_env
# neu starten
eval `ssh-agent`
echo 'export SSH_AUTH_SOCK'=$SSH_AUTH_SOCK >> ~/.ssh/.agent_env
echo 'export SSH_AGENT_PID'=$SSH_AGENT_PID >> ~/.ssh/.agent_env
fi
# erstelle unseren eigenen Hardlink zur Socket-Datei (mit zufälligem Namen)
source ~/.ssh/.agent_env
MYSOCK=/tmp/ssh_agent.${RANDOM}.sock
ln -T $SSH_AUTH_SOCK $MYSOCK
export SSH_AUTH_SOCK=$MYSOCK
end_agent()
{
# wenn wir der letzte Inhaber eines Hardlinks sind, dann den Agenten beenden
nhard=`ls -l $SSH_AUTH_SOCK | awk '{print $2}'`
if [[ "$nhard" -eq 2 ]]; then
rm ~/.ssh/.agent_env
ssh-agent -k
fi
rm $SSH_AUTH_SOCK
}
trap end_agent EXIT
set +x