SSH-Verbindungstimeout zum Erreichen einer interaktiven Sitzung

SSH-Verbindungstimeout zum Erreichen einer interaktiven Sitzung

Gibt es beim Verbinden mit einem fehlerhaften SSH-Server ein Flag oder eine Konfigurationseinstellung, mit der ich dem Client sagen kann, dass er früher aufgeben soll, wenn innerhalb kurzer Zeit keine interaktive Konsole erreicht wird?

Mir ist bewusst, -o ConnectTimeoutdass die Verbindung abgebrochen wird, wenn der Host nicht erreichbar ist. In diesem Fall ist der Host erreichbar und die anfängliche Verbindung erfolgt schnell („Server akzeptiert Schlüssel“ in weniger als 1 Sekunde), aber dann bedeutet ein Ausfall in einer PAM-Schicht, dass ich möglicherweise in 3 Sekunden, 12 Sekunden oder nie eine tatsächliche Eingabeaufforderung erhalte. Die Verbindung bleibt stehen, bis ich Strg+C sende oder 90 Sekunden auf „Verbindung zu [Host] Port 22 abgelaufen“ warte.

Kann ich irgendetwas tun, um das Symptom zu lindern, bis die zugrunde liegende Ursache behoben ist (was ich mit dieser Frage nicht lösen möchte)? Ich möchte die Verbindung automatisch trennen, wenn wir nicht innerhalb von 5 Sekunden bei einer nützlichen Eingabeaufforderung landen.

Antwort1

Wenn die zugrunde liegende Verbindung stabil ist und unser Hauptziel darin besteht, mehrere Sitzungen zu öffnen, ohne PAM-Roulette zu spielen, kann der „Master“-Modus hilfreich sein:

ssh -M -S /tmp/reusable.sock user@host

Wenn Sie den Kampf mit Strg+C/90 Sekunden Timeout das erste Mal gewonnen haben, können andere Terminals schnell mit Folgendem geöffnet werden:

ssh -S /tmp/reusable.sock user@host

Dies funktioniert, solange die ursprüngliche Verbindung offen gehalten wird. Die Verkürzung der Verbindungszeit setzt voraus, dass das Problem im Authentifizierungsschritt liegt (da durch Multiplexen des Sockets auf diese Weise eine erneute Authentifizierung umgangen wird).

Antwort2

Wenn die Verbindung abbricht, bevor die Portweiterleitung eingerichtet ist, können wir einen Socket als Semaphor nutzen und unseren eigenen Watchdog zusammenhacken:

lfg.sh:

#!/bin/bash
set -m

function watchdog {
    sleep $1
    if [[ ! -S "/tmp/lfg.$2" ]]; then
        kill -STOP $3
    fi
}

ssh -L /tmp/lfg.$$:localhost:1234 $1 && rm -f /tmp/lfg.$$ &
watchdog $2 $$ $! &
fg %-

Verwendung:

lfg grumpy-host 5

lfgaktiviert zuerst die Jobsteuerung und initiiert dann sshdie Anforderung eines lokalen Sockets, /tmp/lfg.nnnder an einen beliebigen Remote-Port weitergeleitet wird. Wir versetzen diesen Job in den Hintergrund und bitten die Watchdog-Funktion, 5 Sekunden zu warten und dann nach dem Socket zu suchen. Wenn er nicht da ist, beenden wir den blockierten SSH-Prozess. fg %-versetzt SSH wieder in den Vordergrund, sodass wir, sobald es interaktiv ist, dabei sind; wenn das länger als 5 Sekunden dauert, sind wir wieder bei unserer lokalen Eingabeaufforderung.

verwandte Informationen