2010-01-20 23:33:01 +0000 2010-01-20 23:33:01 +0000
236
236

Sposób na uniknięcie timeoutu połączenia ssh i zamrożenia terminala GNOME

Kiedy łączę się przez ssh z niektórymi serwerami, następuje timeout i “zamrożenie” terminala (nie przyjmuje danych wejściowych, nie rozłącza się, nie można wcisnąć Ctrl-C, aby zabić proces ssh lub cokolwiek innego).

To jest w Ubuntu gnome-terminal, chociaż wydaje się wstrzymywać wejście/wyjście terminala i nie wpływa na działanie samego programu GNOME Terminal. Więc mniej jest to błąd w gnome-terminal niż irytująca niespójność z ssh.

Czy istnieje sposób, aby zapobiec/odzyskać terminal z połączeń ssh, które zakończyły się limitem czasu?

Odpowiedzi (7)

259
259
259
2010-01-20 23:53:48 +0000

sshd (serwer) zamyka połączenie, jeśli przez jakiś czas nie usłyszy nic od klienta. Możesz powiedzieć swojemu klientowi, aby raz na jakiś czas wysyłał sygnał sign-of-life do serwera.

Konfiguracja do tego znajduje się w pliku ~/.ssh/config. Aby wysyłać sygnał co cztery minuty do remotehost, umieść następujące dane w swoim ~/.ssh/config.

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

Oto co ja mam w moim ~/.ssh/config.

Aby włączyć to dla wszystkich hostów użyj:

Host *
  ServerAliveInterval 240

Upewnij się również, że uruchomisz chmod 600 ~/.ssh/config, ponieważ plik konfiguracyjny nie może być odczytywany przez świat.

250
250
250
2010-01-20 23:44:01 +0000

Naciśnij Enter, ~, . jeden po drugim, aby rozłączyć się z zamrożoną sesją.

Sekcja “ESCAPE CHARACTERS” na stronie man ssh wyjaśnia podstawowe szczegóły.

39
39
39
2012-07-03 01:28:14 +0000

Nawet jeśli nie jest to bezpośrednia odpowiedź na twoje pytanie, jest to wysoce związane z problemem, który masz. Zamiast próbować utrzymać połączenie przy życiu (wszystkie połączenia w końcu umierają) możesz użyć multiplekserów terminala, takich jak screen i tmux, które utrzymują sesję przy życiu w tle, nawet jeśli twój terminal zostanie rozłączony.

Zasadniczo, gdy zalogujesz się do serwera SSH, natychmiast uruchamiasz screen, który utworzy i dołączy nową sesję:

$ screen

Następnie idziesz dalej i wykonujesz swoją pracę z powłoką, tak jak byś to robił normalnie. Teraz, jeśli połączenie zostanie przerwane, po powrocie do sieci i ponownym połączeniu się z serwerem przez SSH, otrzymasz listę bieżących sesji z:

$ screen -ls

Aby ponownie dołączyć do sesji:

$ screen -r <session>

gdzie <session> jest PID lub nazwą sesji. Zostaniesz ponownie połączony z sesją i będziesz mógł kontynuować od miejsca, w którym skończyłeś!

Możesz nawet odłączyć sesję i połączyć się ponownie z domu, aby kontynuować dokładnie od tego miejsca, w którym przerwałeś. Aby odłączyć sesję używasz C-a a następnie C-d (czyli Control + A a następnie Control + D).

Istnieje również prosty samouczek online .

Używanie screen i tmux na zdalnych serwerach jest uważane za najlepszą praktykę i jest bardzo zalecane. Niektórzy ludzie posuwają się nawet do tego, że mają screen jako domyślną powłokę logowania, więc kiedy się łączą, natychmiast rozpoczynają nową sesję screen.

12
12
12
2014-02-06 14:13:27 +0000

Spróbuj dodać -o ServerAliveInterval=30 do swojego ciągu połączenia (30 oznacza 30 sekund i może być oczywiście dostosowane)

6
6
6
2016-02-12 22:45:27 +0000

Można również ustawić czas bezczynności po stronie serwera SSH:

Plik: /etc/ssh/ssh_config

Zawartość:

ClientAliveInterval XX
ClientAliveCountMax YY

Działa to dokładnie tak samo jak ustawienie klienta, ale pakiety null są wysyłane z serwera, a nie z klienta.

Wyciągnięto z: http://www.sysadmit.com/2016/02/linux-y-vmware-ssh-evitar-desconexion.html

2
2
2
2015-12-17 02:19:43 +0000

Dla osób, które chcą uniemożliwić klientowi timing out w pierwszej kolejności.

Możesz spróbować ustawić ConnectTimeout 0 w pliku konfiguracyjnym. Wartość 0 oznacza, że połączenie będzie utrzymywane przy życiu w nieskończoność, chyba że zostanie zamknięte.

Twój plik config (lub ssh_config) może wyglądać tak:

Host *
   ConnectTimeout 0
0
0
0
2020-01-24 11:55:41 +0000

W moim przypadku problem tkwił w dużym rozmiarze MTU. Możesz zmienić MTU na routerze, jeśli używasz NAT, ale ja zmieniam MTU na serwerze:

sudo /sbin/ifconfig eth0 mtu 1036
sudo /etc/init.d/networking restart

Na Windowsie możesz również zwiększyć ten klucz:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpMaxDataRetransmissions"=dword:00000010