Wie kann ich ssh-agent über ssh und in tmux (unter OS X) zum Laufen bringen?

17

Ich habe einen privaten Schlüssel für mein Github-Konto eingerichtet, dessen Passphrase meines Erachtens im Schlüsselbund von OS X gespeichert ist. Ich muss es auf keinen Fall eingeben, wenn ich ein Terminalfenster öffne und eintrete ssh [email protected].

Wenn ich bash über eine ssh-Sitzung oder lokal in einer tmux-Sitzung ausführe, muss ich die Passphrase jedes Mal eingeben, wenn ich versuche, ssh auf github zu setzen.

Diese Frage legt nahe, dass ein ähnliches Problem mit dem Bildschirm besteht, aber ich verstehe das Problem nicht gut genug, um es in tmux zu beheben. Es gibt auch diese Seite, die eine ziemlich komplizierte Lösung enthält, aber für zsh.

EDIT :

Als Antwort auf die Antwort von @ Mikel erhalte ich von einem lokalen Terminal die folgende Ausgabe:

[~]
$ echo $SSH_AUTH_SOCK
/tmp/launch-S4HBD6/Listeners
[~] 
$ ssh-add -l
2048 [my key fingerprint] /Users/richie/.ssh/id_rsa (RSA)
[~]
$ typeset -p SSH_AUTH_SOCK
declare -x SSH_AUTH_SOCK="/tmp/launch-S4HBD6/Listeners"

Wohingegen ich über ssh oder im tmux bekomme:

[~]
$ echo $SSH_AUTH_SOCK

[~]
$ ssh-add -l
Could not open a connection to your authentication agent.
[~]
$ typeset -p SSH_AUTH_SOCK
bash: typeset: SSH_AUTH_SOCK: not found

echo $SSH_AGENT_PID Gibt nichts zurück, egal von welcher Shell ich es starte.

Reich
quelle
Was ist typeset -p SSH_AUTH_SOCK?
Mikel
@Mikel bash: typeset: SSH_AUTH_SOCK: not foundaus ssh / tmux heraus. Ich werde es heute Abend vor Ort versuchen, wenn nötig.
Rich
@Mikel Ich habe die Ausgabe dieses Befehls zur Frage hinzugefügt.
Rich
AFAIK, Fragen und Antworten sind nicht OS X-spezifisch. Das ist relevant , einige nicht-OS X-spezifische dups zu vermeiden, nämlich superuser.com/q/334975/46794 und superuser.com/q/479796/46794 .
Blaisorblade
@Blaisorblade Ich hatte den Eindruck, dass meine Passphrase im OS X-Schlüsselbund gespeichert wurde (obwohl ich mich jetzt nicht erinnern kann, warum ich das für richtig hielt). Ist das falsch
Rich

Antworten:

4

Mein Kollege hat einige Bash-Funktionen erstellt, um einen Live-Agenten zu finden: https://github.com/wwalker/ssh-find-agent

Er verwendet es hauptsächlich für die Verbindung zwischen Systemen (Laptop zu Desktop usw.), aber ich verwende es am häufigsten für lokale tmux-Sitzungen, in denen Sie sich von Ihrem Fenstermanager abmelden / anmelden (OS X für mich).

Verwendung

  1. Laden Sie ssh-find-agent.bash herunter ( git clone git://github.com/wwalker/ssh-find-agent.gitfunktioniert).

  2. Fügen Sie ~ / .bashrc Folgendes hinzu:

    . /path/to/ssh-find-agent.bash
    
  3. Dann können Sie Folgendes eingeben, um SSH_AUTH_SOCK in Ihrer aktuellen Shell festzulegen:

    set_ssh_agent_socket
    
user104502
quelle
Ich habe diese Antwort eher akzeptiert als jede andere, die möglicherweise funktioniert, da keine SSH-Agentenweiterleitung erforderlich ist, was für meine Zwecke besser ist. Vielen Dank!
Rich
8

Eine elegante Lösung von dagit.o :

Erstellen ~/.ssh/rc

#!/bin/bash
if [ -S "$SSH_AUTH_SOCK" ]; then
    ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi

Hinzufügen ~/.tmux.conf

set -g update-environment "DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY"
set-environment -g 'SSH_AUTH_SOCK' ~/.ssh/ssh_auth_sock
Mislav
quelle
7

Fügen Sie in Ihrer .tmux.confKonfigurationsdatei die folgende Zeile hinzu:

set -g update-environment "SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION"

Dadurch werden diese Umgebungsvariablen von Ihrer Hauptshell in alle Shells kopiert, die in tmux geöffnet wurden. Dadurch kann ssh-agent in diesen tmux-Shells ordnungsgemäß arbeiten.

Trevor Powell
quelle
2
Dies ist die geeignete Methode, um diese Werte in eine tmux- Sitzung zu übernehmen, aber alle diese Umgebungsvariablen sollten bereits im Standardwert von enthalten sein update-environment. Das OP sollte ihren update-environmentWert überprüfen und möglicherweise aktualisieren, wo immer er bereits geändert wird.
Chris Johnsen
1
Hm .. nachdem ich weiter gegraben habe, stimme ich zu - die Einstellungen, die ich aufgelistet habe, sind bereits in den Standardeinstellungen und wenn ich tmux ohne eine .tmux.conf-Datei ausführe, funktioniert alles richtig. Und wenn ich die von mir zitierte Zeile aus meiner .tmux.conf-Datei entferne, funktioniert dies auch für mich, obwohl dies vorher nicht der Fall war. Es ist klar, dass gelegentlich etwas anderes schief geht. Möglicherweise mit Suspend / Restore oder Attach / Detach oder Sshing in eine TMUX-Sitzung aus der Ferne. Ich werde meine Augen offen halten und aktualisieren, wenn ich den Faktor finde, der es reproduzierbar macht.
Trevor Powell
update-environmentist richtig eingestellt. Das Problem tritt jedoch weiterhin auf.
Rich
2
Das Problem dabei ist, dass die Konfiguration nur dann erneut ausgeführt wird, wenn kein tmuxServer vorhanden ist, was dem Zweck des erneuten Anfügens widerspricht ... Vielleicht gibt es eine Befehlszeilenoption, um diese Variablen erneut zu aktualisieren?
Tobias Kienzler
3

Es ist mir passiert, dass Fenster, die beim Herstellen einer Verbindung über ssh von OS X erstellt wurden, nach einer Weile nach meiner Passphrase fragten. Ich habe einen Weg gefunden, das zu beheben, indem ich diese Zeile von http://santini.di.unimi.it/extras/ph/my-tmux-setup.html gestohlen habe

eval $(tmux show-environment -t [YOUR-SESSION] | grep '^SSH_AUTH_SOCK')

Führen Sie es einfach aus dem Bereich, der sich beschwert.

user1153623
quelle
2

Ich bin mir nicht sicher, ob Sie bash oder eine andere Shell verwenden, aber das tmux-Setup dieses Typen sieht so aus, als würde es für bash funktionieren. Ich persönlich verwende zsh mit oh-my-zsh und habe festgestellt, dass ssh-agent nach dem Hinzufügen von tmux funktioniert

zstyle :omz:plugins:ssh-agent agent-forwarding on

zu meiner .zshrc-Datei und lud die Konfiguration in meinen laufenden zsh-Sitzungen neu. Ich fand auch die zsh-orientierte Lösung dieses Typen , aber es stellte sich für mich als unnötig heraus.

cwjohnston
quelle
1

Was macht:

echo $SSH_AUTH_SOCK
echo $SSH_AGENT_PID
ssh-add -l

drucken?

Führen Sie es in Ihrem normalen Terminal und dann in Ihrer tmuxSitzung aus. Sie sollten dasselbe drucken.

Mikel
quelle
Ich habe die Antwort auf diese Befehle zur Frage hinzugefügt. Ich habe auch festgestellt, dass das Problem auch auftritt, wenn ich mich über ssh anmelde (ohne tmux zu verwenden) und die Frage entsprechend bearbeitet habe.
Rich
4
sshist einfach. Aktivieren Sie die Agentenweiterleitung. Der einfachste Weg, dies zu tun, ist, ssh -Astatt auszuführen ssh. Verwenden Sie einen Alias, damit Sie ihn nicht jedes Mal eingeben oder in Ihren einfügen müssen .SSH/config.
Mikel
Cool, danke. Das hat bei ssh geklappt. Irgendwelche Ideen, wie man es in tmux behebt?
Rich
0

Es gibt viele Lösungen, aber die einfachste findet sich in der Antwort von Hans Ginzel vom 8. Januar 2016 auf eine verwandte StackOverflow-Frage vom 27. Januar 2014 . Fügen Sie Ihrer Shell ~/.profileoder ähnlichem einfach Folgendes hinzu :

alias ssh='eval $(tmux show-env -s | grep "^SSH_") && ssh'

Es müssen keine mehrzeiligen Funktionen definiert oder neue temporäre Dateien erstellt werden. Wenn Sie keinen Alias erstellen möchten ssh, ändern Sie ihn einfach in fixsshund entfernen ihn && ssham Ende und führen fixsshSie ihn aus, wenn Sie versuchen, sshaus einer erneut angehängten tmux-Sitzung heraus zu starten.

Die Antwort von Hans Ginzel legt nahe, dass eine "neuere Version" von tmux benötigt wird, um zu funktionieren show-env -s. Dies funktioniert für mich in tmux 2.7, und auf meiner Lektüre des Changelog , -swurde am 3. Juni 2008 aufgenommen kurz vor der Veröffentlichung von tmux 0,3. tmux 2.3 (29. September 2016) ist in Debian stable.

sjy
quelle