Ich arbeite hauptsächlich auf einem Mac und ssh / tmux, um meine Arbeit zu erledigen. Ich habe ssh-agent auf dem Linux-Rechner ausgeführt. ich habe
set -g update-environment "SSH_AUTH_SOCK SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"
in meinem .tmux.conf
. Immer wenn ich mich wieder an diese Sitzung anschließe, muss ich rennen
tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
damit sich neue tmux windows $SSH_AUTH_SOCK
richtig eingestellt haben. Ich würde es vorziehen, dies nicht tun zu müssen. Irgendwelche Ideen?
Aktualisieren
Ich glaube, ich erkläre das nicht gut. Hier ist meine Shell-Funktion zum Öffnen einer Shell auf einem Remote-Computer:
sshh () {
tmux -u neww -n ${host} "ssh -Xt ${host} $*"
}
Wenn tmux diesen Befehl ssh läuft, $SSH_AUTH_SOCK
ist nicht festgelegt, obwohl es ist in meiner lokalen Umgebung. Wenn ich dies mit dem setenv
obigen Befehl in die tmux-Umgebung setze , funktioniert alles einwandfrei . Meine Frage ist, warum ich den Befehl setenv überhaupt ausführen muss.
Update 2
Mehr Informationen:
Wenn ich eine Verbindung zu einer vorhandenen Sitzung herstelle, $SSH_AUTH_SOCK
wird dies nicht in der tmux-Umgebung (oder globalen Umgebung) festgelegt.
% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK
Wenn ich es manuell einstelle, funktionieren die Dinge:
% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
Wenn ich die Verbindung löse und erneut anbringe, wird $SSH_AUTH_SOCK
die Verbindung nicht hergestellt.
quelle
env
?Antworten:
Da ich die Prämie erhalten habe, werde ich der Vollständigkeit halber meinen Schlüsselkommentar erneut veröffentlichen - und um zu vermeiden, dass Besucher mit demselben Problem auf die falsche Spur geraten:
Tmux entfernt Umgebungsvariablen
Tmux 'Manpage besagt, dass update-environment Variablen entfernen wird, "die in der Quellumgebung nicht existieren, [...] als ob -r an den Befehl set-environment übergeben wurde".
Anscheinend hat das das Problem verursacht. Siehe Chris 'Antwort unten . Ich kann mir jedoch immer noch nicht vorstellen, wie die Variable in der "Quellumgebung" fehlen und dennoch im neu erstellten tmux-Fenster gültig sein könnte ...
Vorherige Antwort:
So funktioniert die SSH-Weiterleitung
Sehen Sie sich auf dem Remotecomputer die Umgebung Ihrer Shell an, nachdem Sie die SSH-Verbindung hergestellt haben:
Das Wichtige hier ist SSH_AUTH_SOCK, das momentan auf eine Datei in / tmp gesetzt ist. Wenn Sie diese Datei untersuchen, werden Sie feststellen, dass es sich um einen Unix-Domain-Socket handelt, der mit der bestimmten Instanz von ssh verbunden ist, über die Sie eine Verbindung hergestellt haben. Wichtig ist, dass sich dies jedes Mal ändert, wenn Sie eine Verbindung herstellen.
Sobald Sie sich abmelden, ist diese bestimmte Socket-Datei verschwunden. Nun, wenn Sie Ihre tmux-Sitzung erneut verbinden, werden Sie das Problem bemerken. Es hat die Umgebung von dem Zeitpunkt an, als tmux ursprünglich gestartet wurde - was Wochen her sein könnte. Diese spezielle Steckdose ist längst tot.
Lösung
Da wir wissen, dass das Problem damit zusammenhängt, zu wissen, wo sich der derzeit aktive SSH-Authentifizierungssocket befindet, sollten wir ihn einfach an einen vorhersehbaren Ort stellen!
Fügen Sie in Ihrer .bashrc- oder .zshrc-Datei auf dem Remotecomputer Folgendes hinzu:
Ich glaube nicht, dass Sie in Ihrer tmux.conf einen 'update-environment-Befehl' einfügen müssen. Gemäß der Manpage wird SSH_AUTH_SOCK bereits standardmäßig abgedeckt.
Kredit
Meine Antwort ist ein Auszug aus diesem Blog-Beitrag von Mark 'xb95' Smith, der das gleiche Problem für den Bildschirm erklärt .
quelle
$SSH_AUTH_SOCK
in neue Shells, sondern das Setzen von$SSH_AUTH_SOCK
tmux-Fenstern, bevor .bashrc / .zshrc bezogen wird.tmux neww ssh somehost
. B. ).SSH_AUTH_SOCK
. Dieser Ansatz funktioniert nur, wenn die tmux-Sitzung über die letzte SSH-Verbindung geöffnet ist.Ich habe das herausgefunden. Kurze Antwort, die ich brauchte entfernen
SSH_AUTH_SOCK
ausupdate-environment
. Da es in dieser Liste war, wurde der Wert jedes Mal weggeblasen, wenn ich ihn wieder anbrachte. Danke an @djf für den Hinweis. Der herausragende Teil der tmux (1) -Manpage imupdate-environment
Abschnitt:quelle
.tmux.conf
, um dies zum Laufen zu bringen:set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"
Haben Sie Probleme mitssh
oder Umgebungsvariablen im Allgemeinen?Anstatt tmux für den Umgang mit meinem ssh-Agenten zu verwenden, habe ich bash, um damit umzugehen:
Ich habe dies in meinem ~ / bashrc , und es funktioniert großartig.
quelle
$SSH_AUTH_SOCK
ist in meinen Shells richtig eingestellt, aber wenn ich so etwas machetmux neww ssh somehost
, werde ich aufgefordert, meine Passphrase einzugeben, um meinen privaten Schlüssel zu entsperren, es sei denn, ich startetmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
.Auf StackOverflow https://stackoverflow.com/a/49395839/241025 habe ich eine ähnliche Frage beantwortet . Da diese Seite bei meinen Google-Suchanfragen an erster Stelle stand, wollte ich hier eine zusammenfassende Version veröffentlichen.
Damit jede tmux-Sitzung einen Satz benutzerdefinierter Umgebungsvariablen enthält, müssen Sie die Werte zu den Umgebungsvariablen pro Sitzung von tmux hinzufügen. Hier ist ein Beispiel, wie es geht.
Der letzte Schritt des expliziten Exportierens von FOO ist erforderlich, damit der aktuelle Bereich die Umgebungsvariable aufnimmt. Alle nachfolgenden Fenster oder Fenster, die Sie für diese tmux-Sitzung erstellen, übernehmen FOO, werden jedoch in anderen Sitzungen nicht angezeigt.
quelle
djfs erklärung bringt eine andere mögliche lösung in mein gedächtnis:
Bevor
tmux
/screen
läuft:ssh-agent
.tmux
/screen
mit der / den Umgebungsvariablenssh-agent
.Dies konnte keine SSH-Weiterleitung an den Client verwenden, dies wurde jedoch nicht verlangt.
quelle
ssh-agent
bindet nicht an TTY, warum sollte es beim Logout getötet werden (?) - warum mitnohup
?