Sposób na uniknięcie przekroczenia limitu czasu połączenia ssh i zawieszenie terminala GNOME

235

Kiedy łączę się za pośrednictwem ssh z niektórymi serwerami, upływa limit czasu i „zawiesza się” terminal (nie akceptuje danych wejściowych, nie rozłącza się, nie może Ctrl-C zabić procesu ssh lub cokolwiek innego).

Jest to w Ubuntu, gnome-terminalchoć wydaje się, że wstrzymuje wejście / wyjście terminala i nie wpływa na działanie samego oprogramowania GNOME Terminal. Więc mniej błędu gnome-terminalniż denerwująca niespójność z ssh.

Czy istnieje sposób, aby zapobiec / odzyskać terminal z połączeń ssh, które przekroczyły limit czasu?

Kzqai
źródło

Odpowiedzi:

256

sshd (serwer) zamyka połączenie, jeśli przez jakiś czas nic nie słyszy od klienta. Możesz od czasu do czasu nakazać klientowi, aby wysyłał do serwera sygnał oznak życia.

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

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

To właśnie mam w sobie ~/.ssh/config.

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

Host *
  ServerAliveInterval 240

Upewnij się także, aby uruchomić chmod 600 ~/.ssh/config, ponieważ plik konfiguracyjny nie może być czytelny dla całego świata.

Ludwig Weinzierl
źródło
1
Dzięki sblair za pomoc w sformułowaniu, jest to bardzo mile widziane. Zmieniłem „nie powinien” z powrotem na „nie mogę”, ponieważ ssh sprawdza uprawnienia do pliku, a jeśli jest on czytelny dla całego świata lub grupy, to kończy się niepowodzeniem.
Ludwig Weinzierl
1
Nie o to prosił PO. Nie zostaje wyrzucony z powodu bezczynności. Próbuje się połączyć, a jego terminal zawiesza się.
Cerin
Gdzie to ~/.ssh/configjest
Użytkownik
1
@ Użytkownik „~ /” reprezentuje folder domowy. „.ssh” to folder w folderze domowym.
wkm
6
jest to bezużyteczne, jeśli połączenie zostanie faktycznie utracone ...
so12311
248

Naciśnij Enter, ~, .jeden po drugim, aby odłączyć się od zamarzniętej sesji.

Sekcja „ZNAK UCIECZKI” na stronie man ssh wyjaśnia podstawowe szczegóły.

Peter Eisentraut
źródło
40
Wydaje mi się, że ta odpowiedź dokładniej odpowiada na pytanie, a w każdym razie była to odpowiedź, której szukałem.
CoatedMoose,
Pamiętaj, że musisz odkomentować linię EscapeChar ~w /etc/ssh/ssh_config(lub ~/.ssh/ssh_configjeśli wolisz).
Aditya,
@adityamenon Nie, EscapeChar ~jest już wbudowanym domyślnym.
Peter Eisentraut,
2
@ Zaznacz pytanie, czy istnieje sposób, aby zapobiec odzyskaniu terminala z połączeń ssh , które przekroczyły limit czasu ? Podkreśl moje.
CoatedMoose
2
Choć w kontekście pytania było to nieprawidłowe, właśnie tego chciałem.
Subin Sebastian
38

Nawet jeśli nie jest to bezpośrednia odpowiedź na twoje pytanie, jest ściśle związana z twoim problemem. Zamiast próbować utrzymywać połączenie przy życiu (wszystkie połączenia w końcu umierają), możesz użyć multiplekserów terminali, takich jak screeni, tmuxktóre utrzymują sesję w tle, nawet jeśli terminal zostanie rozłączony.

Zasadniczo po zalogowaniu się na serwerze SSH natychmiast uruchamiasz się, screenaby utworzyć i dołączyć nową sesję:

$ screen

Następnie idź dalej i wykonuj swoją pracę z powłoką, jak zwykle. Teraz, jeśli połączenie zostanie zerwane, kiedy będziesz mógł wrócić do trybu online i ponownie połączyć 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 nazwa sesji. Nastąpi ponowne połączenie z sesją i możesz kontynuować od miejsca, w którym zostało przerwane!

Możesz nawet odłączyć sesję i połączyć się ponownie z domu, aby odebrać dokładnie z miejsca, w którym zostało przerwane. Aby odłączyć sesję, której używasz, C-aa następnie C-d(to Control + Ai wtedy Control + D).

Jest też prosty samouczek online .

Używanie screeni tmuxna zdalnych serwerach jest uważane za najlepszą praktykę i jest wysoce zalecane . Niektóre osoby idą tak daleko, że mają screendomyślną powłokę logowania, więc po nawiązaniu połączenia natychmiast rozpoczynają nową screensesję.

zdjęcia
źródło
2
inną alternatywą jest użycie mosh: mosh.mit.edu
Zombies
Jest to szczególnie przydatne, jeśli korzystasz z hotspotu lub Wi-Fi, które czasami się przerywają.
Randall,
11

Spróbuj dołączyć -o ServerAliveInterval=30do ciągu połączenia ( 30oznacza to 30 sekund i oczywiście można to zmienić)

Fergie
źródło
1

Dla osób, które chcą przede wszystkim zapobiec przekroczeniu limitu czasu przez klienta.

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

Twój plik config (lub ssh_config) może wyglądać następująco:

Host *
   ConnectTimeout 0
Yohannes Libanos
źródło