1) W skrypcie rc SSH (~ / .ssh / rc) skonfigurujesz dowiązanie symboliczne z lokalizacji kanonicznej do „bieżącego” SSH_AUTH_SOCK. Oto jak to robię w bash (zawartość ~ / .ssh / rc):
#!/bin/bash
if test "$SSH_AUTH_SOCK" ; then
ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi
(i upewnij się, że chmod 755 ~ / .ssh / rc). „Test” ma jedynie na celu zapobieganie wyświetlaniu błędu, jeśli nie korzystasz z ssh-agent (tzn. Masz ssh bez -A). Druga połowa tego polecenia ustawia dowiązanie symboliczne w kanonicznej lokalizacji, która aktualizuje się do „prawdziwego” SSH_AUTH_SOCK podczas logowania. Jest to niezależne od używania powłoki w ssh lub bezpośredniego wywoływania polecenia, działa również z „ssh -t screen -RRD”.
Uwaga: istnienie ~ / .ssh / rc zmienia zachowanie sshd. W szczególności nie będzie wywoływać xauth. Zobacz man sshd, aby uzyskać więcej informacji i jak to naprawić.
Nie powinieneś także używać „-v” z ln, gdy tylko zepsuje rsync-over-ssh z następującą diagnostyką:
$ rsync -n addr.maps.dev.yandex.net: .
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(173) [Receiver=3.0.7]
2) W swoim .screenrc wystarczy zastąpić SSH_AUTH_SOCK do lokalizacji kanonicznej:
setenv SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
Zauważ, że używasz setenv bez względu na to, jakiej powłoki używasz; Myślę, że setenv to składnia ekranu, a nie powłoka.
Rozwiązanie pierwotnie zaadaptowane z tego postu , które nie działa, ale ma właściwy pomysł.
Myślę, że działa to jako uproszczenie odpowiedzi @ sandip-bhattacharya. Umieść to w swoim
~/.bashrc
pliku i uruchom polecenie eksportu we wszystkich aktualnie uruchomionych sesjach ekranu.To brzmi „if
$SSH_AUTH_SOCK
jest gniazdem (-S
), a nie dowiązaniem symbolicznym (! -h
), utwórz nowe dowiązanie symboliczne na znanej ścieżce. We wszystkich przypadkach ponownie zdefiniuj,SSH_AUTH_SOCK
aby wskazywać znaną ścieżkę.W
! -h
unika tworzenia odwołanie cykliczne jeśli uruchomić ten wielokrotnie.Ponadto, jeśli używasz
byobu
, robi to automatycznie, bez potrzeby edytowania plików konfiguracyjnych.Jedyny błąd, który w tym znalazłem (
byobu
też go ma), to to, że jeśli otworzysz drugie połączeniessh -A
lubForwardAgent
połączenie, zastąpi ono pierwsze gniazdo, a jeśli zamkniesz drugie połączenie przed pierwszym, stracisz swoje jedyne dobre gniazdo.źródło
tmux
.~/.ssh/ssh_auth_sock_"$(hostname)"
dla swojego dowiązania symbolicznego. Będzie przechowywać osobne gniazda uwierzytelniania dla każdego hosta.„ssh -t some.machine screen -R” nie uruchomi bash i dlatego nie uruchomi skryptu .bash_profile, w którym tworzony jest dowiązanie symboliczne.
Możesz spróbować: ssh -t some.machine bash -c "screen -R"
(zakładając, że używasz bash jako swojej powłoki)
Edycja: Ta „odpowiedź” jest właściwie komentarzem do pierwszej odpowiedzi podanej powyżej :)
źródło
Myślę, że potrzebujesz autossh. Używam go od lat i w połączeniu z ekranem sprawia, że wszystkie moje sesje terminalowe są całkowicie przenośne i przejrzyste. Po prostu zamykam lappy, przeprowadzam się do nowej lokalizacji, otwieram lappy, a wszystkie moje ekrany i ekrany zagnieżdżone łączą się automatycznie. Już nawet o tym nie myślę.
http://www.linux.com/archive/feature/134133
to podstawy ... Rubinowałem skrypt lil, aby zautomatyzować proces w moim .screenrc dla danego hosta. (także moje przekazywanie ssh, więc we wszystkich tych miejscach mogę tunelować moje połączenie przez moje serwery)
w dystrybucji autossh powinien być program o nazwie rscreen (i .. jest!)
To powinno pomóc w problemach z ssh / screen
Wreszcie, aby utrzymać działanie ssh-agenta, używam pęku kluczy, ponieważ jestem rodzajem powłoki ... Myślę, że OSX ma coś, co pozwala utrzymać twojego agenta w pobliżu ...
źródło
Oto metoda, której używam:
Zazwyczaj konfiguruję alias lub funkcję powłoki za pomocą następujących poleceń:
Może być konieczne dostosowanie wyrażenia regularnego „ screen - (r | DR) ” do dokładnych poleceń używanych do ponownego podłączenia ekranu.
Zastrzeżenie dotyczące mojej metody: może się nie udać, jeśli na komputerze uruchomione zostanie inne polecenie „ screen ”.
źródło
sudo
.Często utrzymuję długoterminowe (ponad 6 miesięcy) sesje w moim miejscu pracy na różnych serwerach. Wielokrotne ponowne podłączanie i posiadanie realnego agenta przekazującego ssh było problematyczne. Oto, co skonfigurowałem w moich systemach:
Jeśli po prostu zaloguję się na serwerze zdalnym bez ekranu uruchamiania / ponownego podłączania, pojawią się dwa „gniazda”, jedno używane przez
screen
drugie, a drugie przez nową powłokę. Nie powinny istnieć dwie sesje „startowe”, ale nadal można rozpocząć drugą sesjęreattach -S new
; w tej sytuacji agent byłby współdzielony z tą~/.ssh/agent-screen
wartością. Aby odzyskać działającego agenta przesyłania dalej, odłączę się, zaloguj ponownie.X${USER} = Xmyusername
Zapewnia to, że kod nie zostanie wywołanysudo
na tym samym serwerze.źródło
Używam odmiany tego, co @apinstein używa dla mojego .bashrc .
Działa to dla wszystkich aplikacji uruchomionych w mojej sesji ekranowej. To działałoby dla wszystkich nowych powłok w sesji ekranowej. W przypadku istniejących powłok należy uruchomić
export SSH_AUTH_SOCK=~/.ssh/ssh_auth_sock
powłokę hosta, aby działała.PS Przepraszam, że dodałem to jako niezależną odpowiedź, podczas gdy po prostu oparło się na odpowiedzi @ apinstein. Musiał to zrobić, ponieważ komentarze w przepełnieniu stosu nie obsługują bloków kodu.
źródło
Wypróbowałem tę prostą linijkę zgodnie z sugestią zawartą w artykule Zróbmy znajomych z ekranu i agenta ssh i to działa dla mnie.
Pierwsze logowanie do Target.Należy zrobić tylko raz.
Uruchom ekran po raz pierwszy. Potrzeba zrobienia tylko raz.
W przypadku odłączenia lub rozłączenia użyj tego polecenia, aby zalogować się później, aby połączyć się z ekranem wyjścia.
źródło
To są naprawdę dobre odpowiedzi. Robię to nieco inaczej. Po uruchomieniu nowej sesji ssh i ponownym podłączeniu ekranu resetuję
SSH_AUTH_SOCK
zmienną środowiskową na podstawie zawartości środowiska root bash. Wymagam dostępu ssh-agent tylko sporadycznie, gdy używam svn, więc po prostu zresetujęSSH_AUTH_SOCK
wymagane w tych powłokach.Wykorzystuje system plików proc, więc jest specyficzny dla systemu Linux. Testowałem to tylko na bezgłowym urządzeniu z linuksem, do którego dostęp mam tylko, może to wymagać drobnych poprawek, aby działało w innych środowiskach.
Aby zresetować SSH_AUTH_SOCK (może to być alias).
screen_auth.sh wygląda następująco
źródło
Wszystkie powyższe rozwiązania podlegają warunkom wyścigowym (podczas wielu sesji EKRANU lub wielu połączeń SSH). Jedynym uniwersalnym rozwiązaniem, o którym mogę pomyśleć, jest wpchnięcie SSH_AUTH_SOCK do procesu serwera SCREEN,
screen -r
a następnie wciągnięcie go do sesji BASH przed każdą interaktywną niewbudowaną komendą. Niestety, SCREEN i BASH zostały zaprojektowane bez świadomości tego rodzaju problemów, więc raczej trudno jest je poprawnie wdrożyć (choć nigdy nie jest za późno, aby zamieścić prośby o dodanie funkcji do obu projektów). Podjęto moją próbę rozwiązania tego problemu dla sesji BASH, które można znaleźć tutaj:Żeby zainstalować:
$HOME/bin
, dodaj bit wykonywalny;upewnij się, że
$HOME/bin
dzieje się to wcześniej/usr/bin
w PATH:ŚCIEŻKA = $ DOM / bin: $ ŚCIEŻKA
dodaj to do
.bashrc
:źródło $ HOME / bin / screen-helper setup
Teraz możesz spróbować utworzyć sesję EKRAN w ramach sesji SSH, odłączyć, rozłączyć, połączyć i ponownie podłączyć, i mam nadzieję, że
ssh-add -l
poprawnie pokażą twoje klucze.źródło
ssh-agent
demon (jak sugerowano tutaj superuser.com/a/412052/376867 ) nie cierpi z powodu warunków wyścigowych, ale cierpi na przestarzały brelok. Co ważniejsze, pozostawienie wszystkich kluczy na zdalnym hoście wraz z sesją screena (lub nawet dłużej do ponownego uruchomienia w przypadku wspomnianego postu) nie jest zbyt bezpieczne.Przejrzałem inne odpowiedzi i nie mogłem znaleźć mojej. Oto czego używam. Utwórz plik
~/.screenrc-wrapper
o następującej treści:I dodaj to do
~/.bashrc
(lub~/.zshrc
jeśli tego używasz):W ten sposób użyjesz dwóch sesji ekranowych - jedna to „wrapper”, a druga wewnętrzna. To pozwoli utrzymać to drugie przy życiu, nawet gdy się wylogujesz i nadal będzie mieć włączony ssh-agent. Kolejną miłą funkcją jest to, że zapamięta konfigurację twojego okna - jeśli używasz podzielonych okien, może być bardzo przydatne.
Możesz znaleźć tę funkcję w kontekście w moich plikach dot .
źródło