Snažím se kódovat skript shellu, který používá připojení ssh pro provádění „tlukotů srdce“. Chci ukončit klientskou a serverovou stranu tohoto připojení po určitém časovém limitu (po přerušení připojení).
Co jsem zatím našel:
- TCPKeepAlive ano/ne pro ssh a sshd
- ClientAliveCountMax pro sshd
- ClientAliveInterval pro sshd
- ServerAliveCountMax pro ssh
- ServerAliveInterval pro ssh
Pro změnu „ClientAliveCountMax“ bych musel upravit sshd_config na každém cílovém počítači (tato možnost je ve výchozím nastavení zakázána).
Moje otázka tedy zní – mohu pro své účely použít také „TCPKeepAlive“ (aniž bych měnil cokoli jiného na zdrojovém/cílovém počítači)?
Cílový operační systém je SLES11 SP2 – ale nemyslím si, že je to zde relevantní.
Přijatá odpověď:
K tomu budete pravděpodobně chtít použít nastavení ServerAlive. Nevyžadují žádnou konfiguraci na serveru a lze je nastavit na příkazovém řádku, pokud si přejete.
ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST
Tím se každých 5 sekund odešle zpráva ssh keepalive, a pokud přijde čas poslat další keepalive, ale odpověď na poslední nebyla přijata, spojení se ukončí.
Zásadní rozdíl mezi ServerAliveInterval
a TCPKeepAlive
je vrstva, na které působí.
TCPKeepAlive
pracuje na vrstvě TCP. Odešle prázdný paket TCP ACK. Firewally lze nakonfigurovat tak, aby tyto pakety ignorovaly, takže pokud projdete firewallem, který ukončí nečinná připojení, nemusí připojení udržet naživu.ServerAliveInterval
funguje na vrstvě ssh. Ve skutečnosti bude odesílat data přes ssh, takže paket TCP má zašifrovaná data a firewall nedokáže určit, zda se jedná o udržovací nebo legitimní paket, takže fungují lépe.