SSH-Sitzungen hängen beim Herunterfahren / Neustarten

13

Ich habe einen Server, auf dem Debian und sshd ausgeführt werden, und falls ich den Server neu starten muss, bleibt meine SSH-Sitzung auf der Clientseite bis zum TCP-Timeout hängen. Ich nehme an, dies liegt daran, dass beim sshdBeenden offene SSH-Sitzungen für den Host nicht explizit geschlossen werden. Wie kann ich vorgehen, um die Verbindung zu sshdtrennen und sich dann wie gewohnt zu beenden? Bisher sehe ich keinen Parameter man sshd_config, der mit dem Verhalten beim Herunterfahren zusammenhängt.

Vesper
quelle
Wenn alles andere fehlschlägt, können Sie einen SSH-Client jederzeit beenden, indem Sie die [Eingabetaste] [~] [.] Drücken. Erklärung, wie Sie Ihr Problem tatsächlich lösen können.
17.

Antworten:

31

Wenn Sie Ihr System herunterfahren oder neu starten, systemdversuchen Sie, alle Dienste so schnell wie möglich zu stoppen. Dazu muss das Netzwerk heruntergefahren und alle noch aktiven Prozesse beendet werden - normalerweise in dieser Reihenfolge. Wenn systemd die gespaltenen SSH-Prozesse beendet, die Ihre SSH-Sitzungen abwickeln, ist die Netzwerkverbindung bereits deaktiviert und die Clientverbindung kann nicht ordnungsgemäß geschlossen werden.

Ihr erster Gedanke könnte sein, einfach alle SSH-Prozesse als ersten Schritt während des Herunterfahrens abzubrechen, und es gibt etliche systemd-Dienstdateien, die genau das tun.

Aber es gibt natürlich eine sauberere Lösung (wie es „angeblich“ getan werden): systemd-logind.
systemd-logindVerfolgt aktive Benutzersitzungen (lokale und SSH-Sitzungen) und weist alle darin hervorgerufenen Prozesse sogenannten "Slices" zu. Wenn das System heruntergefahren wird, kann systemd auf diese Weise einfach alles in den Benutzer-Slices SIGTERMEN (einschließlich des gegabelten SSH-Prozesses, der eine bestimmte Sitzung leitet) und dann die Dienste und das Netzwerk weiter herunterfahren.

systemd-loginderfordert ein PAM-Modul, um über neue Benutzersitzungen informiert zu werden, und Sie müssen dbuses verwenden loginctl, um den Status zu überprüfen. Installieren Sie daher beide:

apt-get install libpam-systemd dbus

Stellen Sie sicher, dass Sie /etc/ssh/sshd_configdas Modul tatsächlich mit verwenden UsePAM yes.

n.st
quelle
Okay, Ziel erreicht und danke für die Erklärung. (Obwohl ich eine Möglichkeit zur Abhängigkeitssteuerung für das Herunterfahren haben möchte, damit alles zuerst SIGTERM wird, während ich in der Lage bin, ihre Arbeit zu beenden, kann dies als geschichtete Lösung ausgeführt werden.)
Vesper
Aus irgendeinem Grund wurde ich nicht über die Antwort informiert, als ich nur StackOverflow besuchte. Seltsam.
Vesper
1
Also, kurz gesagt, um ein paar Sekunden beim Herunterfahren zu sparen, müssen wir eine ganze Ladung Mist installieren, nur um unsere Verbindungen ordnungsgemäß zu beenden? Ernsthaft ? Das wird schief. Wir sind verdammt.
Leucos
3
Beachten Sie, dass beim ersten Neustart nach der Installation von libpam-systemd und dbus Ihre SSH-Sitzung immer noch hängen bleibt. Um zu vermeiden , dass statt reboot, führen Sie eine shutdown -rder standardmäßig auf eine Verzögerung von 1 Minute, so dass Sie Zeit , um die SSH - Sitzung zu schließen.
Mivk
9

Dies ist etwas, das Sie auf der Client-Seite einstellen müssen, nicht auf der Server-Seite. Bearbeiten Sie Ihre ~/.ssh/configzu enthalten

ServerAliveInterval 15
ServerAliveCountMax 5

Dies bedeutet, dass Ihr Client nach 15 Sekunden Inaktivität eine Nachricht an den Server sendet. Wenn es keine Antwort erhält, wird es bis zu fünf Mal erneut versuchen. Wenn es immer noch keine Antwort erhält, wird die Sitzung geschlossen.

Jenny D
quelle
2
Dies führt zu einer Verzögerung von 75 Sekunden, bevor der ssh-Client den Server als tot meldet. Richtig?
Vesper
1
Ja, und Sie können die Parameter anpassen, um das Timeout zu verkürzen.
Tero Kilkanen
Dies löste das Problem für mich. Was für ein irritierendes Problem.
Justin Andrusk
4

Dieses Verhalten wird in diesem Debian- Fehler gemeldet. Sie müssen nur die mit dem Paket gelieferten Shutdown-Skripte korrekt einrichten, da sie automatisch nicht standardmäßig kopiert werden:

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service
Rfraile
quelle
1

Sie können die Optionen, über die Jenny D in ihrer Antwort gesprochen hat, nur für einen ssh-Befehl angeben, z

ssh -t -o ServerAliveInterval=1 -o ServerAliveCountMax=1 user@host sudo poweroff

Wenn Sie das oft tun, können Sie es skripten.

Diego Medaglia
quelle
0

Funktioniert bei mir mit lshd. Die Lösung wäre also

apt install lsh-server
apt remove openssh-server
Gott
quelle
0

Leider ließ mich serverfault seit Jahren nicht mehr mit zu wenigen Punkten im Thread antworten. Aber ich brauche keinen Spam in anderen Blogs, um die Freischaltung zu bekommen ^^ ... als dedizierte Antwort:

Wie Rfraile erwähnte

cp /usr/share/doc/openssh-client/examples/ssh-session-cleanup.service /etc/systemd/system/
systemctl  enable ssh-session-cleanup.service

funktioniert. Um es zu verwenden, ohne die Instanz / den Server neu zu starten, sollten Sie zusätzliche Aufgaben ausführen:

systemctl daemon-reload
systemctl start ssh-session-cleanup.service

Der Dienst ist also registriert und gestartet, und das System muss ihn zum Neustart / Herunterfahren anhalten.

Reiner030
quelle
Also wiederholen Sie nur eine andere Antwort?
RalfFriedl
Nein? Ich habe die 2 Zeilen nur als Referenz für die obere Antwort verwendet, da ich noch nicht wie geschrieben antworten kann. Ich habe die notwendigen Schritte hinzugefügt, um es ohne Neustart zu verwenden. Dies kann auch in einem anderen Fragenthread angegeben werden, den ich aber nicht ausgecheckt habe.
Reiner030