Jak mogę zapobiec zawieszeniu sesji SSH w terminalu OS X?

101

Kiedy zamykam MacBooka z aktywną sesją SSH w Terminalu, a następnie budzę go, monit przestaje odpowiadać.

Za około pięć minut mówi

Write failed: Broken pipe

i kończy się.

Dzieje się tak również wtedy, gdy nie wpisuję niczego w Terminalu w ciągu około piętnastu minut.

Czy mogę zmusić OS X do:

  1. Utrzymaj połączenie SSH przy najdłuższym możliwym czasie
  2. Zabij go natychmiast, gdy przestanie odpowiadać

?

Dan
źródło

Odpowiedzi:

121

Aby utrzymać połączenie przy życiu , możesz sprawdzić w /etc/ssh/ssh_configwierszu, w którym jest napisane ServerAliveInterval, że mówi Ci, jak często (w sekundach) twój komputer będzie wysyłał zerowy pakiet, aby utrzymać połączenie przy życiu. Jeśli masz tam 0, co oznacza, że ​​twój komputer nie próbuje utrzymać połączenia przy życiu (jest wyłączony), w przeciwnym razie mówi ci, jak często (w sekundach) wysyła wspomniany pakiet. Spróbuj wprowadzić 120 lub 240, jeśli nadal zabija twoje połączenie, możesz obniżyć, może do 5, jeśli z tym numerem tak się nie stanie, może to twój router zrzuca połączenie do wolnej pamięci.

Aby go zabić, gdy się rozłączy , możesz użyć znaku ucieczki ssh:

~.

Oznacza to, że naciśnij tyldę, a następnie kropkę, jeśli nie działa, naciśnij klawisz Enter przed naciśnięciem tego przycisku, co spowoduje natychmiastowe zakończenie połączenia.

Jorge Núñez
źródło
3
Ok, możesz zabić połączenie ~., świetna wskazówka! Ale co to właściwie robi?
CousinCocaine
Jedyne, co mnie pomieszało, to to, czy byłam mokra czy nie, musiałem zrestartować sshd, ale wygląda na to, że samo wyjście z sesji i ponowne połączenie
załatwiło sprawę
Często ~. nie działa dla mnie przez kilka minut. Dlaczego?
Sridhar Sarnobat
2
Lokalizacja ssh_configznajduje się /etc/ssh/ssh_configw systemie Mac OS X. Sam bym edytował odpowiedź, ale nie mam wystarczającej liczby przedstawicieli na tej stronie, aby to zrobić.
Erik B,
powinienem umieścić to w kliencie lub serwerze? Myślę, że klient, ale może być jaśniejszy.
EralpB,
23

Możesz:

Skonfiguruj system dla całego połączenia, edytując: / etc / ssh / ssh_config I dodaj wiersz:

ServerAliveInterval 10

Lub na serwer ~ / .ssh / config

Host keepsdroppingme.com
   ServerAliveInterval 10

Co to w zasadzie wysyła, utrzymuje pakiet przy życiu, co 10 sekund ...

Aleksandar Pavić
źródło
9

Możesz także spróbować użyć niesamowitego projektu mosh . Z wdzięcznością poradzi sobie z utratą sieci, przejściem w tryb uśpienia itp. I szczęśliwie przywróci połączenie, gdy znów będziesz mieć działającą sieć.

Kolejnym bardziej uświęconym rozwiązaniem jest użycie tmux na zdalnym komputerze. W takim przypadku nadal możesz dostać zepsutą rurę, ale jeśli ponownie połączysz swoją powłokę, a aplikacje będą czekać tak, jak je opuściłeś.

BinaryPaean
źródło
Właściwie to właśnie teraz robię.
Dan
5

Różne odpowiedzi tutaj są sprzeczne, jeśli chodzi o dokładną ścieżkę do plików konfiguracyjnych. Może jest inaczej w różnych uniksach? Sugeruję przeczytanie stron podręcznika systemowego w twoim systemie!

W man ssh (1) wyszukaj tekst: config . W moim systemie mam do wyboru pliki konfiguracyjne dla całego systemu lub dla tego użytkownika (a ścieżki są dziwnie różne).

W man ssh_config (5) wyszukaj tekst: żywy . W moim systemie wygląda na to, że muszę ustawić zarówno ServerAliveInterval, jak i ServerAliveCountMax .

Dla mnie, w macOS 10.12 Sierra, zadziałało umieszczenie następujących dwóch wierszy w ~ / .ssh / config:

ServerAliveInterval 20
ServerAliveCountMax 180

Teraz mogę ssh na moim serwerze Ubuntu 16.04 bez rozłączania przez 20 * 180 sekund = 1 godzinę. Uczyniłem mój dzień!

Jerry Krinock
źródło
3

Automatycznie podłącz ponownie ssh po uśpieniu lub przerwie w Wi-Fi

  1. Zainstaluj autossh z MacPorts lub Homebrew:brew install autossh

  2. Otwórz terminal i uruchom autossh -M 20000 -f [SSH ARGUMENTS GO HERE]

  3. Odłącz Wi-Fi lub uśp komputer Mac.

  4. Po ponownym połączeniu z siecią Wi-Fi sesja ssh automatycznie się ponownie połączy.


Automatycznie ssh po zalogowaniu

Jon Stacey napisał post na blogu o automatycznej aktywacji sesji ssh po zalogowaniu.

  1. Zainstaluj autossh z MacPorts lub Homebrew:brew install autossh

  2. Utwórz przepływ pracy Automatora za pomocą skryptu bash.

Skrypt powłoki Automatora

  1. Przejdź do elementów logowania w Preferencjach systemowych .

Preferencje systemowe> Elementy logowania

  1. Dodaj przepływ pracy Automatora do pozycji logowania .

Przedmioty logowania

Kamil Slowikowski
źródło
1

Dodaj te dwie linie do /etc/ssh/ssh_config:

ServerAliveInterval 60
TCPKeepAlive yes
MOHRE
źródło
1

Właśnie rozwiązałem ten problem, dodaj następujące wiersze $HOME/.ssh/config.

Host *
  ServerAliveInterval 120
  TCPKeepAlive no

Ustawienie TCPKeepAlive nomówi klientowi, aby po prostu założył, że połączenie jest nadal dobre, dopóki nie zostanie udowodnione inaczej przez żądanie użytkownika, co oznacza, że ​​tymczasowe zerwanie połączenia, gdy twój termin ssh jest bezczynny w tle, nie zabije połączenia.

Nur Rony
źródło