Ich versuche, ein Shell-Skript zu codieren, das eine SSH-Verbindung verwendet, um „Heartbeats“ auszuführen. Ich möchte die Client- und Serverseite dieser Verbindung nach einem bestimmten Timeout (nachdem die Verbindung getrennt wurde) beenden.
Was ich bisher gefunden habe:
- TCPKeepAlive ja/nein für ssh und sshd
- ClientAliveCountMax für sshd
- ClientAliveInterval für sshd
- ServerAliveCountMax für ssh
- ServerAliveInterval für ssh
Um „ClientAliveCountMax“ zu ändern, müsste ich die sshd_config auf jedem Zielcomputer ändern (diese Option ist standardmäßig deaktiviert).
Meine Frage ist also – kann ich „TCPKeepAlive“ auch für meine Zwecke verwenden (ohne irgendetwas anderes auf den Quell-/Zielmaschinen zu ändern)?
Zielbetriebssystem ist SLES11 SP2 – aber ich denke nicht, dass das hier relevant ist.
Akzeptierte Antwort:
Wahrscheinlich möchten Sie dafür die ServerAlive-Einstellungen verwenden. Sie erfordern keine Konfiguration auf dem Server und können auf Wunsch in der Befehlszeile eingestellt werden.
ssh -o ServerAliveInterval=5 -o ServerAliveCountMax=1 $HOST
Dadurch wird alle 5 Sekunden eine ssh-Keepalive-Nachricht gesendet, und wenn es an der Zeit ist, eine weitere Keepalive-Nachricht zu senden, aber keine Antwort auf die letzte empfangen wurde, wird die Verbindung beendet.
Der entscheidende Unterschied zwischen ServerAliveInterval
und TCPKeepAlive
ist die Ebene, auf der sie operieren.
TCPKeepAlive
arbeitet auf der TCP-Schicht. Es sendet ein leeres TCP-ACK-Paket. Firewalls können so konfiguriert werden, dass sie diese Pakete ignorieren. Wenn Sie also eine Firewall passieren, die inaktive Verbindungen unterbricht, halten diese die Verbindung möglicherweise nicht aufrecht.ServerAliveInterval
arbeitet auf der ssh-Schicht. Es sendet tatsächlich Daten über ssh, sodass das TCP-Paket verschlüsselte Daten enthält und eine Firewall nicht erkennen kann, ob es sich um ein Keepalive- oder ein legitimes Paket handelt, daher funktionieren diese besser.