Jak mogę sprawić, aby ssh-agent działał na ssh iw tmux (w OS X)?

17

Mam skonfigurowany klucz prywatny dla mojego konta github, którego hasło jest, jak sądzę, przechowywane w pęku kluczy OS X. Z pewnością nie muszę go wpisywać, kiedy otwieram okno terminala i wchodzę ssh [email protected].

Jednak gdy uruchamiam bash nad sesją ssh lub lokalnie wewnątrz sesji tmux, muszę wpisywać hasło za każdym razem, gdy próbuję ssh na github.

To pytanie sugeruje, że podobny problem istnieje z ekranem, ale tak naprawdę nie rozumiem tego problemu wystarczająco dobrze, aby rozwiązać go w tmux. Jest też ta strona, która zawiera dość skomplikowane rozwiązanie, ale dla zsh.

EDYCJA :

W odpowiedzi na odpowiedź @ Mikela z lokalnego terminala otrzymuję następujące dane wyjściowe:

[~]
$ 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"

Natomiast przez ssh lub w tmux otrzymuję:

[~]
$ 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 nic nie zwraca niezależnie od powłoki, z której go uruchamiam.

Bogaty
źródło
Co typeset -p SSH_AUTH_SOCK?
Mikel
@Mikel bash: typeset: SSH_AUTH_SOCK: not foundz poziomu ssh / tmux. W razie potrzeby spróbuję tego wieczorem.
Bogaty
@Mikel Dodałem wynik tego polecenia do pytania.
Bogaty
AFAIK, pytania i odpowiedzi nie są specyficzne dla OS X. Jest to istotne, aby uniknąć niektórych duplikatów niespecyficznych dla systemu operacyjnego X, a mianowicie superuser.com/q/334975/46794 i superuser.com/q/479796/46794 .
Blaisorblade,
@ Blaisorblade Miałem wrażenie, że moje hasło zostało zapisane w pęku kluczy OS X (chociaż nie pamiętam teraz, dlaczego tak uważam). Czy to nieprawda?
Rich

Odpowiedzi:

4

Mój kolega stworzył kilka funkcji bash, aby pomóc w znalezieniu agenta na żywo: https://github.com/wwalker/ssh-find-agent

Używa go głównie do łączenia systemów (laptop z komputerem stacjonarnym itp.), Ale najczęściej używam go do lokalnych sesji tmux, w których wylogowujesz się / logujesz z menedżera okien (dla mnie OS X).

Stosowanie

  1. Pobierz ssh-find-agent.bash ( git clone git://github.com/wwalker/ssh-find-agent.gitdziała).

  2. Dodaj następujące elementy do ~ / .bashrc:

    . /path/to/ssh-find-agent.bash
    
  3. Następnie możesz wpisać następujące polecenie, aby ustawić SSH_AUTH_SOCK w bieżącej powłoce:

    set_ssh_agent_socket
    
użytkownik104502
źródło
Zaakceptowałem tę odpowiedź, a nie inne, które mogą działać, ponieważ nie wymagają przekazywania agenta SSH, co jest lepsze dla moich celów. Dzięki!
Bogaty
8

Eleganckie rozwiązanie, wybrane z dagit.o :

Stwórz ~/.ssh/rc

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

Dodać do ~/.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
źródło
7

W .tmux.confpliku konfiguracyjnym dodaj ten wiersz:

ustaw -g środowisko aktualizacji "SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION"

Powoduje to skopiowanie tych zmiennych środowiskowych z głównej powłoki do dowolnych powłok otwartych w tmux, co następnie pozwala ssh-agentowi na poprawne działanie w tych powłokach tmux.

Trevor Powell
źródło
2
Jest to odpowiednia metoda wprowadzania tych wartości do sesji tmux , ale wszystkie zmienne środowiskowe powinny już być uwzględnione w wartości domyślnej update-environment. PO powinien sprawdzić ich update-environmentwartość i ewentualnie zaktualizować, gdziekolwiek jest już zmieniany.
Chris Johnsen
1
Hm .. po dalszym kopaniu zgadzam się - wymienione ustawienia są już domyślne i jeśli uruchomię tmux bez pliku .tmux.conf, wszystko działa poprawnie. A jeśli usunę wiersz, który zacytowałem z mojego pliku .tmux.conf, to również działa dla mnie, chociaż wcześniej nie. Najwyraźniej czasem coś idzie nie tak. Być może ma to związek ze zdalnym zawieszeniem / przywróceniem lub dołączeniem / odłączeniem lub sshingiem do sesji tmux. Będę mieć otwarte oczy i aktualizować, jeśli znajdę czynnik, który sprawia, że ​​jest odtwarzalny.
Trevor Powell,
update-environmentjest ustawiony poprawnie. Jednak problem nadal występuje.
Bogaty
2
Problem polega na tym, że konfiguracja zostanie tmuxuruchomiona ponownie tylko wtedy, gdy nie ma serwera, co jest sprzeczne z celem ponownego przyłączenia ... Może istnieje przełącznik linii poleceń, aby zaktualizować te zmienne?
Tobias Kienzler,
3

Zdarzyło mi się, że panele utworzone podczas łączenia przez ssh z OS X zaczęły pytać o moje hasło po pewnym czasie pracy w porządku. Znalazłem sposób, aby naprawić tę kradzież tej linii z http://santini.di.unimi.it/extras/ph/my-tmux-setup.html

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

Po prostu uruchom go z okienka, które narzeka.

użytkownik1153623
źródło
2

Nie jestem pewien, czy używasz bash czy innej powłoki, ale konfiguracja tmux tego faceta wygląda na to, że zadziała dla bash. Osobiście używam zsh z oh-my-zsh i odkryłem, że ssh-agent zaczął działać w tmux po dodaniu

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

do mojego pliku .zshrc i ponownie załadowałem konfigurację w moich uruchomionych sesjach zsh. Znalazłem również zorientowane na zsh rozwiązanie tego faceta , ale okazało się to dla mnie niepotrzebne.

cwjohnston
źródło
1

Co robi:

echo $SSH_AUTH_SOCK
echo $SSH_AGENT_PID
ssh-add -l

wydrukować?

Uruchom go w normalnym terminalu, a następnie uruchom go w tmuxsesji. Powinny wydrukować to samo.

Mikel
źródło
Dodałem odpowiedź na te polecenia do pytania. Zdałem sobie również sprawę, że problem występuje również, gdy loguję się przez ssh (bez użycia tmux) i odpowiednio zmodyfikowałem pytanie.
Bogaty
4
sshjest proste. Włącz przekazywanie agentów. Najłatwiejszym sposobem na to jest uruchomienie ssh -Azamiast ssh. Użyj aliasu, aby nie musieć go wpisywać za każdym razem ani wstawiać do swojego .SSH/config.
Mikel
Fajne dzięki. To działało dla ssh. Wszelkie pomysły, jak to naprawić w tmux?
Bogaty
0

Istnieje wiele rozwiązań, ale najprostsze z nich znajduje się w odpowiedzi Hansa Ginzela z dnia 8 stycznia 2016 r. Na powiązane pytanie StackOverflow z dnia 27 stycznia 2014 r . Po prostu dodaj do swojej powłoki ~/.profilelub podobnego:

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

Nie ma potrzeby definiowania funkcji wieloliniowych ani tworzenia nowych plików tymczasowych. Jeśli nie chcesz aliasu ssh, po prostu zmień go na fixsshi usuń && sshna końcu i uruchom fixsshza każdym razem, gdy próbujesz uruchomić sshod wewnątrz dołączonej sesji tmux.

Odpowiedź Hansa Ginzela sugeruje, że do uruchomienia wymagana jest „nowsza wersja” tmux show-env -s. Działa to na mnie w tmux 2,7, a na mojej lektury changelogu , -sdodano w dniu 3 czerwca 2008 roku, tuż przed wydaniem tmux 0,3. tmux 2.3 (29 września 2016) jest w stabilnej wersji Debiana.

sjy
źródło