Sto provando a codificare uno script di shell che utilizza una connessione ssh per eseguire "battiti cardiaci". Voglio terminare il lato client e server di quella connessione dopo un certo timeout (dopo che la connessione si interrompe).
Cosa ho trovato finora:
- TCPKeepAlive sì/no per ssh e sshd
- ClientAliveCountMax per sshd
- Intervallo ClientAlive per sshd
- ServerAliveCountMax per ssh
- Intervallo ServerAlive per ssh
Per modificare "ClientAliveCountMax" dovrei modificare sshd_config su ogni macchina di destinazione (questa opzione è disabilitata per impostazione predefinita).
Quindi la mia domanda è:posso usare "TCPKeepAlive" anche per i miei scopi (senza modificare nient'altro sulle macchine di origine/destinazione)?
Il sistema operativo di destinazione è SLES11 SP2, ma non credo che sia rilevante qui.
Risposta accettata:
Probabilmente vorrai usare le impostazioni di ServerAlive per questo. Non richiedono alcuna configurazione sul server e possono essere impostati dalla riga di comando se lo si desidera.
ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST
Questo invierà un messaggio ssh keepalive ogni 5 secondi, e se arriva il momento di inviare un altro keepalive, ma non è stata ricevuta una risposta all'ultimo, la connessione viene interrotta.
La differenza fondamentale tra ServerAliveInterval
e TCPKeepAlive
è il livello in cui operano.
TCPKeepAlive
opera sul livello TCP. Invia un pacchetto TCP ACK vuoto. I firewall possono essere configurati per ignorare questi pacchetti, quindi se passi attraverso un firewall che interrompe le connessioni inattive, queste potrebbero non mantenere attiva la connessione.ServerAliveInterval
opera sul livello ssh. In realtà invierà i dati tramite ssh, quindi il pacchetto TCP contiene dati crittografati e un firewall non può dire se è un pacchetto keepalive o legittimo, quindi funzionano meglio.