Ich versuche einen guten Weg zu finden, um den SSH-Agenten wiederherzustellen, wenn ich eine getrennte tmux-Sitzung wieder verbinde.
Die Ursache scheint zu sein, dass sich die Sitzung des SSH-Agenten ändert, die Umgebungsvariable aus der tmux-Sitzung jedoch nicht aktualisiert wird.
Wie kann ich dies automatisieren, bevor ich die Sitzung selbst anhänge? Da die Sitzung, an die ich anhänge, nicht immer eine Bash-Eingabeaufforderung enthält, kann ich es mir nicht leisten, etwas darin einzugeben. Es muss etwas sein, das ausgeführt werden muss, bevor die tmux-Sitzung erstellt oder angehängt wird.
Ein Beispiel für den Code, den ich ausführe, ist https://gist.github.com/ssbarnea/8646491 - ein kleiner SSH-Wrapper, der tmux verwendet, um persistem SSH-Verbindungen zu erstellen. Dies funktioniert recht gut, aber manchmal funktioniert der SSH-Agent nicht mehr, sodass ich ihn nicht mehr verwenden kann, um eine Verbindung zu anderen Hosts herzustellen.
Antworten:
Es gibt einen ausgezeichneten Kern von Martijn Vermaat, der Ihr Problem ausführlich behandelt, obwohl er für Bildschirmbenutzer gedacht ist. Deshalb passe ich ihn hier für tmux an.
Zusammenfassen:
Erstellen
~/.ssh/rc
Sie , wenn es noch nicht vorhanden ist, und fügen Sie den folgenden Inhalt hinzu:#!/bin/bash # Fix SSH auth socket location so agent forwarding works with tmux if test "$SSH_AUTH_SOCK" ; then ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock fi
Lass es in tmux funktionieren, füge dies zu deinem hinzu
~/.tmux.conf
:# fix ssh agent when tmux is detached setenv -g SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
Zusätzliche Arbeit ist erforderlich, wenn Sie die X11-Weiterleitung aktivieren möchten .
quelle
set -g update-environment -r
zu .tmux hinzufügen , damit dieser Prozess funktioniert. Ich habe auch einige Namespaces zur Erstellung von Socket-Links hinzugefügt: gist.github.com/bcomnes/e756624dc1d126ba2eb6Während Variablen standardmäßig
tmux
aktualisiertSSH
werden, ist dies nicht erforderlichSSH_AUTH_SOCKET
VariableIch mag die Lösung von Chris Down, die ich geändert habe, um eine Funktion hinzuzufügen
in
~/.bashrc
. Anruffixssh
nach dem Anhängen der Sitzung oder vorssh
/scp
/rsync
.Neuere Versionen der
tmux
Support--s
Option fürshow-env
, also nurist möglich.
quelle
$DISPLAY
Variable anzuzeigen, tmux erneut zuzuordnen und$DISPLAY
in meinem Fall korrekt einzustellenexport DISPLAY=localhost:14.0
, aber die Anzahl scheint sich bei jeder ssh-Sitzung zu ändern.Folgendes verwende ich zum Aktualisieren
SSH_AUTH_SOCK
in einemtmux
Fenster (basierend auf Hans Ginzels Skript):Oder dafür
tmux
hat nichtshowenv -s
:quelle
Hier ist meine Lösung, die beide Ansätze umfasst und keine zusätzliche Eingabe erfordert, wenn ich mich wieder mit der tmux-Sitzung verbinde
quelle
eval $(tmux showenv -s SSH_AUTH_SOCK)
lokal und nicht remote ausgeführt!Hier gibt es viele gute Antworten. Aber es gibt Fälle, in denen
tmux show-environment
nicht gesehen wirdSSH_AUTH_SOCK
. In diesem Fall können Siefind
es explizit suchen.Das ist lang und kompliziert, also werde ich es aufschlüsseln ...
export
DieSSH_AUTH_SOCK
Umgebungsvariable, die auf die Ausgabe der$()
Befehlssubstitution gesetzt istfind
Dateien, die in beginnen/tmp
/ssh-
im Pfadagent
Sie können möglicherweise 6 & 7 weglassen, wenn Sie wissen, dass es nur 1 Ergebnis gibt und Sie sich nicht für stderr-Müll interessieren.
quelle
find
:find /tmp -path '*/ssh-*' -name 'agent*' -uid (id -u) -printf "%T+\t%p\n" 2>/dev/null | sort | tail -n1 | awk -F'\t' '{print $2 }'
Ich verwende eine Variation der vorherigen Antworten:
Angenommen, Sie haben den SSH-Agenten von der äußeren Umgebung aus gestartet. Gleiches gilt für andere Umgebungsvariablen wie
DISPLAY
.quelle
-g
bekomme ich den abgestandenen Wert von$SSH_AUTH_SOCK
. Weggehen-g
macht den Trick. Siehe auch andere Antworten.Ich ziehe es vor, die Konfiguration von TMUX (usw.) zu vermeiden und alles rein zu behalten
~/.ssh/
. Auf dem Remote- System:Erstellen
~/.ssh/rc
:Fügen Sie Folgendes hinzu,
~/.ssh/config
damit es nicht mehr darauf angewiesen ist$SSH_AUTH_SOCK
, was in freistehenden Terminals veraltet ist:Bekannte Einschränkungen
ssh-add
wird nicht verwendet~/.ssh/config
und kann daher nicht mit kommunizierenssh-agent
. Befehle wiessh-add -l
erzeugen Fehler, obwohl sie gutssh user@host
funktionieren, ebenso wie das Aktualisieren von Git-Fernbedienungen, auf die über SSH zugegriffen wird.quelle
Möglicherweise habe ich eine Lösung ausgearbeitet, die vollständig in der
~/.tmux.conf
Konfigurationsdatei enthalten ist. Es ist ein anderer Ansatz als das Ändern des~/.bash_profile
und~/.ssh/rc
.Lösung nur mit
~/.tmux.conf
Schneiden Sie einfach den folgenden Code aus und fügen Sie ihn in Ihren ein
~/.tmux.conf
# ~/.tmux.conf # SSH agent forwarding # # Ensure that SSH-Agent forwarding will work when re-attaching to the tmux # session from a different SSH connection (after a dropped connection). # This code will run upon tmux create, tmux attach, or config reload. # # If there is an SSH_AUTH_SOCK originally defined: # 1) Remove all SSH related env var names from update-environment. # Without this, setenv cannot override variables such as SSH_AUTH_SOCK. # Verify update-environment with: tmux show-option -g update-environment # 2) Force-set SSH_AUTH_SOCK to be a known location # /tmp/ssh_auth_sock_tmux # 3) Force-create a link of the first found ssh-agent socket at the known location if-shell '[ -n $SSH_AUTH_SOCK ]' " \ set-option -sg update-environment \"DISPLAY WINDOWID XAUTHORITY\"; \ setenv -g SSH_AUTH_SOCK /tmp/ssh_auth_sock_tmux; \ run-shell \"ln -sf $(find /tmp/ssh-* -type s -readable | head -n 1) /tmp/ssh_auth_sock_tmux\" \ "
Vorbehalt
Die obige Lösung ist zusammen mit den anderen Lösungen anfällig für eine Race-Bedingung, wenn mehrere Verbindungen zu derselben Maschine hergestellt werden. Bedenken Sie:
ssh_auth_sock
Link schreiben )ssh_auth_sock
Link überschreiben )ssh_auth_sock
Link, wodurch er unterbrochen wirdssh-agent
Diese Lösung ist jedoch etwas widerstandsfähiger, da sie den
ssh_auth_sock
Link nur beim Starten / Anhängen von tmux überschreibt , anstatt beim Initialisieren einer Bash-Shell~/.bash_profile
oder einer SSH-Verbindung~/.ssh/rc
Um diese letzte Racebedingung abzudecken, kann eine Schlüsselbindung hinzugefügt werden, um die tmux-Konfiguration mit einer
(Ctrl-b r)
Schlüsselsequenz neu zu laden .# ~/.tmux.conf # reload config file bind r source-file ~/.tmux.conf
Wenn Sie diese Sequenz innerhalb einer aktiven tmux-Sitzung ausführen, wenn die
ssh_auth_sock
Verbindung veraltet ist, wird die SSH-Agent-Verbindung aktualisiert .quelle
Nachdem ich auf so viele Vorschläge gestoßen war, fand ich endlich eine Lösung, mit der TMUX den veralteten SSH-Agenten nach dem Anhängen aktualisieren kann. Grundsätzlich müssen sowohl die zshrc-Dateien auf dem lokalen als auch auf dem Remotecomputer geändert werden.
Fügen Sie die folgenden Codes in das lokale zshrc ein, das auf dieser Referenz basiert .
export SSH_AUTH_SOCK=~/.ssh/ssh-agent.$(hostname).sock ssh-add -l 2>/dev/null >/dev/null # The error of executing ssh-add command denotes a valid agent does not # exist. if [ $? -ge 1 ]; then # remove the socket if it exists if [ -S "${SSH_AUTH_SOCK}" ]; then rm "${SSH_AUTH_SOCK}" fi ssh-agent -a "${SSH_AUTH_SOCK}" >/dev/null # one week life time ssh-add -t 1W path-to-private-rsa-file fi
Fügen Sie den folgenden Code in das Remote-zshrc ein, an das die tmux-Sitzung angehängt wird.
alias fixssh='eval $(tmux showenv -s SSH_AUTH_SOCK)'
Dann ssh in die entfernte Maschine. Die Option -A ist erforderlich.
Hängen Sie die TMUX-Sitzung an. Überprüfen Sie die TMUX-Umgebungsvariablen
# run this command in the shell tmux showenv -s # or run this command after prefix CTRL+A or CTRL+B :show-environment
Führen Sie es
fixssh
in den zuvor vorhandenen Bereichen aus, um den SSH-Agenten zu aktualisieren. Wenn ein neuer Bereich erstellt wird, wird automatisch der neue SSH-Agent abgerufen.quelle