it-swarm.com.de

So aktualisieren Sie SSH-Agentenumgebungsvariablen beim Anhängen an vorhandene tmux-Sitzungen automatisch

Ich versuche, eine nette Methode zum Wiederherstellen des SSH-Agenten zu finden, wenn ich eine getrennte tmux-Sitzung wieder verbinde.

Die Ursache scheint zu sein, dass sich die SSH-Agentensitzung ändert, die Umgebungsvariable aus der tmux-Sitzung jedoch nicht aktualisiert wird.

Wie kann ich dies automatisieren, bevor Sie die Sitzung selbst anfügen? Da die Sitzung, mit der ich verbunden bin, nicht immer eine Bash-Eingabeaufforderung enthält, kann ich es mir nicht leisten, etwas einzugeben. Es muss etwas ausgeführt werden, bevor die tmux-Sitzung erstellt oder angehängt wird.

Ein Beispiel für den Code, den ich ausführen möchte, ist unter https://Gist.github.com/ssbarnea/8646491 - ein kleiner ssh-Wrapper, der tmux zum Erstellen von persistem SSH-Verbindungen verwendet. Das funktioniert gut, aber manchmal funktioniert der SSH-Agent nicht mehr, sodass ich ihn nicht mehr für die Verbindung zu anderen Hosts verwenden kann.

58
sorin

Es gibt ein ausgezeichnetes Gist von Martijn Vermaat, das Ihr Problem ausführlich behandelt, obwohl es für Bildschirmbenutzer vorgesehen ist.

Zusammenfassen:

  1. erstellen Sie ~/.ssh/rc, falls noch nicht vorhanden, 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
    
  2. Damit es in tmux funktioniert, fügen Sie dies zu Ihrem ~/.tmux.conf hinzu:

    # 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, siehe Gist .

69
pymkin

Während tmuxupdatesSSH Variablen standardmäßig verwendet werden, ist dies nicht erforderlich

  • socketpfad ändern/hinzufügen
  • Ändern Sie die SSH_AUTH_SOCKET-Variable

Ich mag die Lösung von Chris Down , die ich geändert habe, um Funktion hinzuzufügen

fixssh() {
    eval $(tmux show-env    \
        |sed -n 's/^\(SSH_[^=]*\)=\(.*\)/export \1="\2"/p')
}

in ~/.bashrc. Rufen Sie fixssh nach der Verbindungssitzung oder vor ssh/scp/rsync auf.

Neuere Versionen von tmux unterstützen die Option -s nur für show-env

eval $(tmux show-env -s |grep '^SSH_')

ist möglich.

23
Hans Ginzel

Ich verwende Folgendes zum Aktualisieren von SSH_AUTH_SOCK in einem tmux-Fenster (basierend auf Hans Ginzels Skript):

alias fixssh='eval $(tmux showenv -s SSH_AUTH_SOCK)'

Oder für tmux, die keinen showenv -s hat:

alias fixssh='export $(tmux showenv SSH_AUTH_SOCK)'
15
user1338062

Hier ist meine Lösung, die beide Ansätze umfasst und keine zusätzlichen Eingaben erfordert, wenn ich mich erneut mit der tmux-Sitzung verbinde

alias ssh='[ -n "$TMUX" ] && eval $(tmux showenv -s SSH_AUTH_SOCK); /usr/bin/ssh'
3
Max

Ich verwende eine Variation der vorherigen Antworten:

eval "export $(tmux show-environment -g SSH_AUTH_SOCK)"

angenommen, Sie haben den SSH-Agenten aus der äußeren Umgebung gestartet. Gleiches gilt für andere Umgebungsvariablen wie DISPLAY.

3
Raffi

Hier gibt es viele gute Antworten. Es gibt jedoch Fälle, in denen tmux show-environmentSSH_AUTH_SOCK nicht angezeigt wird. In diesem Fall können Sie find verwenden, um es explizit zu suchen.

export SSH_AUTH_SOCK=$(find /tmp -path '*/ssh-*' -name 'agent*' -uid $(id -u) 2>/dev/null | tail -n1)

Das ist lang und kompliziert, also werde ich es kaputt machen ...

01  export SSH_AUTH_SOCK=$(
02    find /tmp \
03      -path '*/ssh-*'
04      -name 'agent*'
05      -uid $(id -u)
06      2>/dev/null
07    | tail -n1
08  )
  1. export die SSH_AUTH_SOCK-Umgebungsvariable, die auf die Ausgabe der $()-Befehlsersetzung gesetzt ist
  2. find Dateien beginnend mit /tmp
  3. beschränken Sie die Ergebnisse auf nur diejenigen mit /ssh- im Pfad
  4. ergebnisse auf nur diejenigen beschränken, deren Name mit agent beginnt
  5. ergebnisse auf nur diejenigen beschränken, deren Benutzer-ID mit dem aktuellen Benutzer übereinstimmt
  6. alle Fehler (Berechtigungen usw.) zum Schweigen bringen
  7. nimm nur das letzte Ergebnis, wenn es mehrere gibt

Sie können 6 & 7 verlassen, wenn Sie wissen, dass es nur 1 Ergebnis gibt und Sie sich nicht für stderr Müll interessieren.

2
Bruno Bronosky

Ich vermeide es, TMUX (etc) zu konfigurieren und alles rein in ~/.ssh/ zu behalten. Auf dem remote system:

~/.ssh/rc erstellen:

#!/bin/bash

# Fix SSH auth socket location so agent forwarding works within tmux
if test "$SSH_AUTH_SOCK" ; then
  ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi

Fügen Sie ~/.ssh/config Folgendes hinzu, damit es nicht mehr auf $SSH_AUTH_SOCK angewiesen ist, das in abgelösten Terminals nicht mehr aktuell ist:

Host *
  IdentityAgent ~/.ssh/ssh_auth_sock

Bekannte Einschränkungen

  • ssh-add verwendet ~/.ssh/config nicht und kann daher nicht mit ssh-agent kommunizieren. Befehle wie ssh-add -l erzeugen Fehler, auch wenn ssh [email protected] gut funktioniert, ebenso wie die Aktualisierung von git-Fernbedienungen, auf die über SSH zugegriffen wird.
1
RobM