Jak mogę przekazać już przekazany klucz SSH do Tmux?


15

Łączę się przez SSH z komputera, na którym przechowywane są moje klucze, przekierowuję na drugi komputer, a następnie próbuję użyć kluczy z poziomu tmux. Wydaje mi się, że „tracę” przekazywanie podczas wchodzenia do tmux. Jak mogę „przekierować ponownie”, aby móc używać moich kluczy z poziomu tmux?

$ ssh [server] -o ForwardAgent=yes
$ git pull       # Succeeds.
$ /bin/bash
$ git pull       # Still succeeds, despite new shell.
$ exit
$ tmux attach
$ git pull       # Permission denied (publickey)

Potwierdzam, że jeśli uruchomisz agenta współużytkowanego przez wszystkie sesje, to działa. Dokumentacja na bose.utmb.edu/Compu_Center/ssh/SSH_HOWTO.html > Konfiguruj proces ssh-agent wyjaśnia metodę osiągnięcia tego wyniku.
Dereckson

Odpowiedzi:


12

Jeśli dołączasz już istniejącą sesję tmux, powłoka nie dziedziczy zmiennych środowiskowych z powłoki logowania. W szczególności nie odziedziczy zmiennych środowiskowych agenta ssh.

Wypróbuj tę poprawkę :

  1. Utwórz ten skrypt i umieść go w $ HOME / .ssh / saveagent

    #!/bin/sh
    SSHVARS="SSH_CLIENT SSH_TTY SSH_AUTH_SOCK SSH_CONNECTION DISPLAY"
    
    for var in ${SSHVARS} ; do
      echo "export $var=\"$(eval echo '$'$var)\""
    done 1>$HOME/.ssh/latestagent
  2. Dodaj go do skryptu uruchamiania powłoki. Na przykład, jeśli używasz bash:

    echo '. ~/.ssh/saveagent' >> ~/.bash_login
  3. Po dołączeniu tmux, uruchom . $HOME/.ssh/latestagent

Zobacz także Jak mogę uruchomić skrypt natychmiast po połączeniu przez SSH? i Dołącz do sesji tmux i uruchom polecenie


1
Wyślij do .profile, jeśli próbujesz być kompatybilny z innymi powłokami sh.
Dereckson

2
Świetna odpowiedź! Kilka problemów wpadłem na: a - niektóre środowiska zmienne zawierać spacji, więc linia przedostatni w saveagentskrypcie powinny być: echo "export $var=\"$(eval echo '$'$var)\"". b - zamiast tego latestagentnależy wywołać skrypt , więc ustawienie zmiennych wpłynie na powłokę wywołującą. c - automatyczne wywoływanie skryptu po dołączeniu tmux można wykonać za pomocą metody opisanej tutaj: unix.stackexchange.com/questions/86925/…sourceshlatestagent
Joe

Dzięki @Joe zmodyfikowałem swoją odpowiedź, aby uwzględnić Twoje ulepszenia.
GnP

0

O ile nie chcesz źródła skryptu zawierającego wszystkie potrzebne zmienne w każdej powłoce, którą dalej spawnujesz w każdej nowej powłoce spawnowanej przez te same tmuxsesje serwera, prawdopodobnie będziesz chciał powiedzieć, tmuxaby wstawić zmienne do sesji lub środowisk globalnych za pomocą set-environmentpolecenia. Na przykład tak (dla bash):

for var in DISPLAY SSH_AUTH_SOCK ...; do
    tmux setenv "$var" "${!var}"
done

pamiętaj, aby dodać -gflagę, jeśli chcesz ją również w innych sesjach i użyć, -t <session>jeśli uruchamiasz ją spoza tmux.


0

Po przeczytaniu innych odpowiedzi tutaj, postanowiłem po prostu skopiować moją publiczną / prywatną parę kluczy na zdalny serwer, aby nie musiałem martwić się o przekazywanie agentów.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.