Halten Sie die SSH-Sitzung am Leben [geschlossen]

240

Ich benutze, ssh -p8520 username@remote_hostum Remote-Server anzumelden.

Problem :

Es ist immer verbunden und funktioniert einwandfrei, wenn ich am Arbeitsplatz bin. Leider friert das Terminal innerhalb von 10 bis 15 Minuten ein, nachdem ich mich von zu Hause aus mit dem Remote-Server verbunden habe.

Es gibt keinen Fehler- / Zeitüberschreitungsbericht auf der Konsole, aber der Cursor kann sich nicht mehr bewegen.

Bei der Eingabe w, um die Login-Benutzer zu überprüfen, sind einige Zombies-Login-Benutzer vorhanden, und ich muss sie manuell töten.

Das ist ziemlich nervig. Kann mir jemand helfen?

Haifeng Zhang
quelle
Ich habe das auch gehabt, ich fing an zu benutzen screen. Vielleicht ist dies eine Art Timeout-Problem.
Martin
@martin screenhilft, das Programm am Laufen zu halten. Leider muss ich manchmal auf dem Remote-Server arbeiten :(
Haifeng Zhang
Wenn Sie es ohne Parameter starten, erhalten Sie eine Shell.
Martin
Sagst du screennur? Es kann das Problem der verlorenen Verbindung lösen? Nein screen -S screenName? Ich benutze immer Bildschirm mit -Sund-r
Haifeng Zhang
1
Nein, dies löst das Problem nicht. Sie vermeiden nur, dass Sie Ihre Arbeit im Terminal verlieren. Wenn Sie nichts tun, friert es immer noch ein. Sie können einfach dort weitermachen, wo Sie angefangen haben. Ich meinte, dass Sie ein Terminal erstellen können, das Sie jederzeit mit wieder aufnehmen können screen. Sie scheinen das bereits zu wissen;)
Martin

Antworten:

448

Der ssh-Daemon (sshd), der serverseitig ausgeführt wird, schließt die Verbindung von der Serverseite, wenn der Client stumm geschaltet wird (dh keine Informationen sendet). Um einen Verbindungsverlust zu vermeiden, weisen Sie den SSH-Client an, ab und zu ein Lebenszeichen-Signal an den Server zu senden.

Die Konfiguration hierfür befindet sich in der Datei $HOME/.ssh/config. Erstellen Sie die Datei, falls sie nicht vorhanden ist (die Konfigurationsdatei darf nicht für die Welt lesbar sein. Führen Sie sie daher chmod 600 ~/.ssh/confignach dem Erstellen der Datei aus). Fügen Sie Folgendes in diese Konfigurationsdatei ein, um das Signal z. B. alle vier Minuten (240 Sekunden) an den Remote-Host zu senden:

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

Fügen Sie den folgenden Inhalt in die Konfigurationsdatei ein, um das Senden eines Keep-Alive-Signals für alle Hosts zu ermöglichen:

Host *
    ServerAliveInterval 240
rockymonkey555
quelle
24
@ user271996, warum sollte man einen Daemon für eine clientseitige Einstellung neu starten?
Maxschlepzig
Die Konfiguration darf nur vom Benutzer beschreibbar sein. Lesbarkeit ist kein Problem. Die Verwendung von 600 als Berechtigungsstufe ist in Ordnung, da dies nur vom Benutzer beschreibbar ist.
Jbruni
1
Nur für den Fall, dass es nicht offensichtlich ist, dass sich diese Konfigurationsdatei auf Ihrer PC / Linux-Box befindet
zzapper
5
Ich bin immer verwirrt über den Konfigurationsnamen: Der Client verwendet, ServerAliveInterval während der Server verwendet ClientAliveInterval . Was für ein Chaos.
Youkaichao
@youkaichao Es gibt oft diese Verwirrung. Als API-Designer gibt es Gründe, warum ich es auf beide Arten ausdrücken könnte. Am wichtigsten ist letztendlich eine gute Dokumentation des gewählten Standards.
Cameron Tacklind
170

Ich wollte eine einmalige Lösung:

ssh -o ServerAliveInterval=60 [email protected]

Gespeichert in einem Alias:

alias sshprod='ssh -v -o ServerAliveInterval=60 [email protected]'

Jetzt kann man sich so verbinden:

me@MyMachine:~$ sshprod
Ryan
quelle
12
Das ist cool, aber nicht gerade eine "einmalige Lösung". Wenn Sie mehrmals eine Verbindung zum Server herstellen möchten , warum nicht Host *& ServerAliveInterval 240(oder geben Sie den Hostnamen an, wenn Sie ihn nur [email protected]wie in der Antwort von rockymonkey555 verwenden möchten ? Das Festlegen eines Alias ​​scheint in keiner Weise einfacher zu sein.
Lambart
8
Oder erstellen Sie einfach einen Alias ​​in Ihrem ~ / .bashrc:alias ssh='ssh -o ServerAliveInterval=60'
Jabba
15
Er meint "einmal" wie in "es funktioniert nur einmal", nicht "ich muss es nur einmal schreiben".
Jonathan Hartley
1
Ja, wenn Sie "einmalig" als "einmalig" lesen, funktioniert dies perfekt.
Philraj
Wenn Sie einen „one-liner“ , die Sätze ServerAliveIntervalzu 60, groß. Es .ssh/configist jedoch einfach albern , einen Bash-Alias ​​zu verwenden, wenn Sie ihn verwenden könnten .
Cameron Tacklind
50

Für diejenigen, die sich fragen, @ Edward-Coast

Wenn Sie die Keep Alive-Funktion für den Server festlegen möchten , fügen Sie Folgendes hinzu /etc/ssh/sshd_config:

ClientAliveInterval 60
ClientAliveCountMax 2

ClientAliveInterval : Legt ein Zeitlimit in Sekunden fest. Wenn keine Daten vom Client empfangen wurden, sendet sshd (8) eine Nachricht über den verschlüsselten Kanal, um eine Antwort vom Client anzufordern.

ClientAliveCountMax : Legt die Anzahl der aktiven Client-Nachrichten (siehe unten) fest, die gesendet werden können, ohne dass sshd (8) Nachrichten vom Client zurückerhält. Wenn dieser Schwellenwert erreicht wird, während Client-Alive-Nachrichten gesendet werden, trennt sshd den Client und beendet die Sitzung.

Jeff Davenport
quelle
Es scheint, dass es keinen "Parameter" wie ClientAliveInterval gibt, nur ServerAliveInterval. Sie können dies auf der Handbuchseite "man ssh_config"
dtj
6
Das ist die falsche, suchen Sie in "man sshd_config" nach dem Serverteil, auf dem der ssh-Daemon ausgeführt wird, nicht nach der Client-Konfiguration.
Jeff Davenport
Soll ich ClientAliveIntervalden Server auf lebendigen Client prüfen lassen oder soll der Client den Server ServerAliveIntervalwiederholt "pingen" lassen ? Beides scheint keinen Sinn zu ergeben
qrtLs
1
Nur der Set ClientAliveIntervalauf dem Server , wenn der Server auf toten Verbindungen trennen wollen , die nicht reagieren zu tun, und Sie können festlegen , wie oft und wann das passiert.
Jeff Davenport
19

Kitteinstellungen

Zu Ihrer Information Kitt Benutzer können die Optionen hier einstellen

Ruben Benjamin
quelle
10

Wir können unsere SSH-Verbindung am Leben erhalten, indem wir die folgenden globalen Konfigurationen verwenden

Fügen Sie der /etc/ssh/ssh_configDatei die folgende Zeile hinzu :

ServerAliveInterval 60
minhas23
quelle
Funktioniert das nur für den Client oder auch für sshd?
Edward Coast
1
@EdwardCoast Es funktioniert auf dem Client-Computer. Ich habe es auf Mac getestet
minhas23