Utrzymaj sesję SSH przy życiu [zamknięte]

241

Używam ssh -p8520 username@remote_hostdo logowania do zdalnego serwera.

Problem :

Jest zawsze podłączony i działa poprawnie, gdy jestem w miejscu pracy. Niestety terminal zawiesza się po 10-15 minutach od połączenia się ze zdalnym serwerem z domu.

Na konsoli nie ma raportu o błędzie / przekroczeniu limitu czasu, ale kursor nie może się już poruszać.

Kiedy wchodzisz, wby sprawdzić użytkowników logujących, niektórzy użytkownicy zombie są tam i muszę ich zabić ręcznie.

To dość denerwujące. Czy ktoś może mi pomóc?

Haifeng Zhang
źródło
Też miałem, zacząłem używać screen. Może to jakiś problem z przekroczeniem limitu czasu.
martin
@martin screenpomaga utrzymać działanie programu. Niestety czasami muszę pracować na zdalnym serwerze :(
Haifeng Zhang
Jeśli uruchomisz go bez parametrów, otrzymasz powłokę.
martin
Czy screentylko to mówisz ? Może rozwiązać problem utraconego połączenia? Nie screen -S screenName? Zawsze używam ekranu z -Si-r
Haifeng Zhang
1
Nie, to nie rozwiązuje problemu, unikasz tylko utraty pracy w terminalu. Jeśli nic nie zrobisz, nadal będzie się zawieszać, możesz po prostu zacząć od początku. Miałem na myśli, że możesz stworzyć terminal, który zawsze możesz wznowić, używając screen. Wydaje się, że już to wiesz;)
martin

Odpowiedzi:

450

Demon ssh (sshd), który działa po stronie serwera, zamyka połączenie po stronie serwera, jeśli klient ucichnie (tzn. Nie wysyła informacji). Aby zapobiec utracie połączenia, poinstruuj klienta ssh, aby od czasu do czasu wysyłał do serwera sygnał oznak życia.

Konfiguracja tego znajduje się w pliku $HOME/.ssh/config, utwórz plik, jeśli nie istnieje (plik konfiguracyjny nie może być czytelny dla całego świata, więc uruchom go chmod 600 ~/.ssh/configpo utworzeniu pliku). Aby wysyłać sygnał co np. Cztery minuty (240 sekund) do zdalnego hosta, umieść w tym pliku konfiguracyjnym:

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

Aby umożliwić wysyłanie sygnału podtrzymania aktywności dla wszystkich hostów, umieść następującą zawartość w pliku konfiguracyjnym:

Host *
    ServerAliveInterval 240
rockymonkey555
źródło
24
@ user271996, dlaczego należy zrestartować demona dla ustawień po stronie klienta?
maxschlepzig
Konfiguracja może być zapisywalna tylko przez użytkownika. czytelność nie stanowi problemu. Używanie 600 jako poziomu uprawnień jest w porządku, ponieważ jest to tylko do zapisu przez użytkownika.
jbruni
1
na wszelki wypadek nie jest oczywiste, że ten plik konfiguracyjny znajduje się na twoim komputerze / Linuksie
zzapper
5
Zawsze mylę się co do nazwy konfiguracji: klient używa ServerAliveInterval podczas korzystania z serwera ClientAliveInterval . Co za bałagan.
youkaichao
@youkaichao Często zdarza się to zamieszanie. Jako projektant interfejsu API mam powody, aby umieścić go na dwa sposoby. Ostatecznie najważniejsza jest dobra dokumentacja wybranego standardu.
Cameron Tacklind
170

Chciałem jednorazowego rozwiązania:

ssh -o ServerAliveInterval=60 [email protected]

Zapisano w aliasie:

alias sshprod='ssh -v -o ServerAliveInterval=60 [email protected]'

Teraz można połączyć w następujący sposób:

me@MyMachine:~$ sshprod
Ryan
źródło
12
To fajne, ale nie do końca „jednorazowe rozwiązanie”. Jeśli zamierzasz połączyć się z serwerem więcej niż jeden raz, dlaczego nie zrobić Host *& ServerAliveInterval 240(lub podać nazwę hosta, jeśli chcesz go tylko tak, [email protected]jak w odpowiedzi rockymonkey555? Ustawienie aliasu nie wydaje się w żaden sposób łatwiejsze
Lambart
8
Lub po prostu utwórz alias w swoim ~ / .bashrc:alias ssh='ssh -o ServerAliveInterval=60'
Jabba
15
On ma na myśli „jeden raz”, jak w „to działa tylko raz”, a nie „Muszę to napisać tylko raz”.
Jonathan Hartley
1
Tak, jeśli czytasz „jednorazowo” jako „jednorazowego użytku”, robi to doskonale.
philraj
Jeśli chcesz mieć „liner”, który ustawia ServerAliveIntervalsię 60, świetnie. Jednak użycie aliasu bash, gdy można go użyć, .ssh/configjest po prostu głupie.
Cameron Tacklind
50

Dla tych, którzy zastanawiają się, @ edward-coast

Jeśli chcesz ustawić utrzymanie aktywności serwera , dodaj to do /etc/ssh/sshd_config:

ClientAliveInterval 60
ClientAliveCountMax 2

ClientAliveInterval : Ustawia limit czasu w sekundach, po którym, jeśli nie otrzymano żadnych danych od klienta, sshd (8) wyśle ​​wiadomość przez zaszyfrowany kanał z prośbą o odpowiedź od klienta.

ClientAliveCountMax : Ustawia liczbę żywych wiadomości klienta (patrz poniżej), które mogą zostać wysłane bez sshd (8) odbierającej jakiekolwiek wiadomości z powrotem od klienta. Jeśli ten próg zostanie osiągnięty podczas wysyłania żywych wiadomości klienta, sshd rozłączy klienta, kończąc sesję.

Jeff Davenport
źródło
Wygląda na to, że nie ma takiego „parametru” jak ClientAliveInterval, tylko ServerAliveInterval, można sprawdzić na stronie podręcznika „man
ssh_config
6
To jest niewłaściwe, poszukaj w „man sshd_config” części serwera z uruchomionym demonem ssh, a nie konfiguracji klienta.
Jeff Davenport,
Czy powinienem ClientAliveIntervalpozwolić, aby serwer sprawdził, czy klient żyje, czy powinienem pozwolić, aby klient ServerAliveIntervalwielokrotnie „pingował” serwer ? Oba wydają się nie mieć sensu
qrtLs
1
Ustaw opcję ClientAliveIntervalna serwerze tylko, jeśli chcesz, aby serwer rozłączał się w przypadku martwych połączeń, które nie odpowiadają, i możesz dostosować częstotliwość i czas wystąpienia takiej awarii.
Jeff Davenport,
19

ustawienia szpachli

Użytkownicy FYI Putty mogą tutaj ustawić opcje

Ruben Benjamin
źródło
10

Możemy utrzymać nasze połączenie ssh przy użyciu następujących globalnych konfiguracji

Dodaj następujący wiersz do /etc/ssh/ssh_configpliku:

ServerAliveInterval 60
minhas23
źródło
Czy to działa tylko dla klienta, czy działa również dla sshd?
Edward Coast,
1
@EdwardCoast Działa na komputerze klienta. Przetestowałem to na komputerze Mac
minhas23