Warum muss ich env vars in tmux neu einstellen, wenn ich es erneut anhänge?

37

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_SOCKrichtig 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_SOCKist nicht festgelegt, obwohl es ist in meiner lokalen Umgebung. Wenn ich dies mit dem setenvobigen 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_SOCKwird 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_SOCKdie Verbindung nicht hergestellt.

Chris W.
quelle
Hier geht es überhaupt nicht um SSH, oder? Welche Umgebungsvariablen haben Sie in einer neuen Shell, was ist die Ausgabe von env?
Hauke ​​Laging
Welche Shell benutzt du auf dem Mac? Bash?
slm
@HaukeLaging Es geht wirklich um tmux.
Chris W.
@slm Ich benutze zsh.
Chris W.
Was ist mit den vorhandenen Fenstern? Arbeiten sie noch
Hauke ​​Laging

Antworten:

35

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:

user@remote:~$ env | grep SSH
SSH_CLIENT=68.38.123.35 45926 22
SSH_TTY=/dev/pts/0
SSH_CONNECTION=68.38.123.35 48926 10.1.35.23 22
SSH_AUTH_SOCK=/tmp/ssh-hRNwjA1342/agent.1342

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:

# Predictable SSH authentication socket location.
SOCK="/tmp/ssh-agent-$USER-screen"
if test $SSH_AUTH_SOCK && [ $SSH_AUTH_SOCK != $SOCK ]
then
    rm -f /tmp/ssh-agent-$USER-screen
    ln -sf $SSH_AUTH_SOCK $SOCK
    export SSH_AUTH_SOCK=$SOCK
fi

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 .

djf
quelle
Vielen Dank für Ihre Rückmeldung. Meine Frage betrifft nicht das Setzen von my $SSH_AUTH_SOCKin neue Shells, sondern das Setzen von $SSH_AUTH_SOCKtmux-Fenstern, bevor .bashrc / .zshrc bezogen wird.
Chris W.
@ ChrisW. Ich ging davon aus, dass das Skript in die RC-Datei Ihrer Anmeldeshell auf dem Remotecomputer gestellt werden sollte. Wenn Sie sich anmelden, wird eine neue Shell erzeugt, SSH_AUTH_SOCK wird geändert und exportiert . Wenn Sie dann tmux starten, erbt es SSH_AUTH_SOCK von der übergeordneten Umgebung. Da der Wert von SSH_AUTH_SOCK jetzt festgelegt ist, sollte tmux weiterhin an nachfolgenden Anmeldungen arbeiten ... Vielleicht habe ich das Problem falsch verstanden
djf
Ich vermute, meine Verwirrung betrifft die Umgebung, in der ssh von tmux im Kontext eines neuen Fensters ausgeführt wird (z tmux neww ssh somehost. B. ).
Chris W.
Ein Problem bei diesem Ansatz ist, dass eine zweite SSH-Verbindung zum Computer den Wert von überschreibt SSH_AUTH_SOCK. Dieser Ansatz funktioniert nur, wenn die tmux-Sitzung über die letzte SSH-Verbindung geöffnet ist.
Phylae
12

Ich habe das herausgefunden. Kurze Antwort, die ich brauchte entfernen SSH_AUTH_SOCKaus update-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 im update-environmentAbschnitt:

Alle Variablen, die in der Quellumgebung nicht vorhanden sind, werden so festgelegt, dass sie aus der Sitzungsumgebung entfernt werden (als ob -r an den Befehl set-environment übergeben wurde).

Chris W.
quelle
1
@ ChrisW. Könnten Sie bitte etwas deutlicher sein? Ich glaube, ich habe das gleiche Problem: Manchmal funktioniert der Agent nicht mehr, wenn ich tmux-Sitzungen wieder anhänge. Es ist sinnvoll, da die SSH-Verbindung neu ist und wenn ich ssh starte, wird ein neuer Agent gestartet. Was muss ich ändern, damit es funktioniert? Ich hoffe, es ist etwas, das ich ausführen kann, da ich nicht jede Maschine neu konfigurieren muss, auf der ich ssh-in bin. - Jetzt habe ich einen ssh-Wrapper, der tmux remote startet oder vorhandene Verbindungen wiederherstellt. Wahrscheinlich könnte ich etwas tun, bevor ich tmux wiederherstelle.
Sorin
@ ChrisW. kurze antworten sind manchmal nett, aber könntest du bitte eine lange antwort geben? Ich habe Probleme damit, das zum Laufen zu bringen, und nichts in diesem Beitrag funktioniert für mich.
Redbmk
@sorin @redbmk Entschuldigung. Dies ist die einzige Zeile, die ich in meinem ändern musste .tmux.conf, um dies zum Laufen zu bringen: set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY" Haben Sie Probleme mit sshoder Umgebungsvariablen im Allgemeinen?
Chris W.
2

Anstatt tmux für den Umgang mit meinem ssh-Agenten zu verwenden, habe ich bash, um damit umzugehen:

### SSH Agent ### {{{
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
    echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

## Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
  else
    start_agent;
fi
### End SSH Agent ### }}}

Ich habe dies in meinem ~ / bashrc , und es funktioniert großartig.

zurückhaltend
quelle
$SSH_AUTH_SOCKist in meinen Shells richtig eingestellt, aber wenn ich so etwas mache tmux neww ssh somehost, werde ich aufgefordert, meine Passphrase einzugeben, um meinen privaten Schlüssel zu entsperren, es sei denn, ich starte tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK.
Chris W.
1

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.

tmux new-session -s one
tmux setenv FOO foo-one
export FOO='foo-one'

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.

RobotNerd
quelle
0

djfs erklärung bringt eine andere mögliche lösung in mein gedächtnis:

Bevor tmux/ screenläuft:

  1. Anmeldung.
  2. Starten Sie eine Instanz von ssh-agent.
  3. Starten Sie dazu tmux/ screenmit der / den Umgebungsvariablen ssh-agent.

Dies konnte keine SSH-Weiterleitung an den Client verwenden, dies wurde jedoch nicht verlangt.

Hauke ​​Laging
quelle
1
ssh-agentbindet nicht an TTY, warum sollte es beim Logout getötet werden (?) - warum mit nohup?
Poige
@poige Richtig.
Hauke ​​Laging