Próbuję napisać skrypt powłoki, który używa połączenia ssh do wykonywania „uderzeń serca”. Chcę zakończyć połączenie po stronie klienta i serwera po pewnym czasie (po zerwaniu połączenia).
Co znalazłem do tej pory:
- TCPKeepAlive tak / nie dla ssh i sshd
- ClientAliveCountMax dla sshd
- ClientAliveInterval dla sshd
- ServerAliveCountMax dla ssh
- ServerAliveInterval dla ssh
Aby zmienić „ClientAliveCountMax” musiałbym zmodyfikować sshd_config na każdym komputerze docelowym (ta opcja jest domyślnie wyłączona).
Więc moje pytanie brzmi - czy mogę używać „TCPKeepAlive” również do moich celów (bez zmiany czegokolwiek na maszynach źródłowych / docelowych)?
Docelowym systemem operacyjnym jest SLES11 SP2 - ale nie sądzę, żeby miało to tutaj znaczenie.
ControlMaster
opcji i korzystasz z połączeń slave?Odpowiedzi:
Prawdopodobnie chcesz do tego użyć ustawień ServerAlive. Nie wymagają one żadnej konfiguracji na serwerze i można je ustawić w wierszu poleceń.
Spowoduje to wysłanie komunikatu podtrzymującego ssh co 5 sekund, a jeśli przyjdzie czas, aby wysłać kolejny komunikat podtrzymujący, ale odpowiedź na ostatnią nie została odebrana, połączenie zostanie przerwane.
Krytyczną różnicą między warstwą
ServerAliveInterval
iTCPKeepAlive
jest warstwa, na której działają.TCPKeepAlive
działa na warstwie TCP. Wysyła pusty pakiet TCP ACK. Zapory można skonfigurować tak, aby ignorowały te pakiety, więc jeśli przejdziesz przez zaporę, która zrzuca bezczynne połączenia, mogą one nie utrzymywać połączenia.ServerAliveInterval
działa na warstwie ssh. W rzeczywistości wyśle dane przez ssh, więc pakiet TCP ma zaszyfrowane dane, a zapora ogniowa nie może stwierdzić, czy jest to pakiet podtrzymujący, czy legalny, więc działają one lepiej.źródło
Seconds between keepalives
na 1800 w Ustawieniach | Połączenie.Ta
TCPKeepAlive
opcja jest w rzeczywistości zupełnie inną metodą utrzymywania połączeń przy życiu niż opcje podobne do ClientAlive lub ServerAlive.Są na stronie podręcznika BSD SSH , możemy przeczytać, że:
TCPKeepAlive
Upewnić się, czy system powinien wysyłać wiadomości keepalive TCP na drugą stronę. Domyślna opcja jest zawsze włączona.Jeśli używasz
ClientAliveInterval
, możesz wyłączyćTCPKeepAlive
. Ta opcja wyśle wiadomość przez zaszyfrowany kanał z prośbą o odpowiedź od klienta (domyślnie jest to 0, więc żadne wiadomości nie są wysyłane do klienta) iClientAliveCountMax
ustawia liczbę aktywnych wiadomości klienta, zanim sshd rozłączy klienta, kończąc sesja.źródło