Le sessioni SSH si bloccano all'arresto / riavvio


13

Ho un server che esegue Debian e sshd su di esso, e nel caso in cui ho bisogno di riavviare il server la mia sessione SSH si blocca sul lato client fino al timeout TCP. Presumo che ciò sia dovuto al fatto che quando sshdviene terminato non chiude esplicitamente le sessioni SSH aperte all'host. Cosa devo fare per sshddisconnettere prima tutti, quindi terminare normalmente? Finora non vedo un parametro man sshd_configcorrelato al comportamento di shutsown.


Quando tutto il resto fallisce, è possibile uccidere un client SSH in qualsiasi momento premendo [Invio] [~] [.]. Spiegazione su come risolvere effettivamente il tuo problema.
n.

Risposte:


32

Quando si spegne o si riavvia il sistema, systemdtenta di arrestare tutti i servizi il più velocemente possibile. Ciò comporta l'abbattimento della rete e l'interruzione di tutti i processi ancora attivi, in genere in questo ordine. Pertanto, quando systemd interrompe i processi SSH biforcuti che gestiscono le sessioni SSH, la connessione di rete è già disabilitata e non hanno modo di chiudere la connessione client con grazia.

Il tuo primo pensiero potrebbe essere quello di uccidere tutti i processi SSH come primo passo durante l'arresto, e ci sono parecchi file di servizio di sistema là fuori che fanno proprio questo.

Ma c'è ovviamente una soluzione più ordinato (come si "suppone" essere fatto): systemd-logind.
systemd-logindtiene traccia delle sessioni utente attive (locali e SSH) e assegna tutti i processi generati al loro interno alle cosiddette "sezioni". In questo modo, quando il sistema viene spento, systemd può semplicemente SIGTERM tutto all'interno delle sezioni dell'utente (che include il processo SSH biforcuto che gestisce una sessione particolare) e quindi continuare a chiudere i servizi e la rete.

systemd-logindrichiede un modulo PAM per ricevere notifiche sulle nuove sessioni utente e dovrai dbusutilizzarlo loginctlper verificarne lo stato, quindi installa entrambi:

apt-get install libpam-systemd dbus

Assicurati /etc/ssh/sshd_configdi utilizzare il modulo con UsePAM yes.


Ok, obiettivo raggiunto e grazie per la spiegazione. (Anche se mi piacerebbe un modo di controllo delle dipendenze per l'arresto, in modo che tutto sia il primo SIGTERM mentre si è in grado di finire il loro lavoro, questo può fare come una soluzione a strati.)
Vesper

Per qualche motivo non sono stato informato della risposta mentre visitavo solo StackOverflow. Strano.
Vesper,

1
Quindi, in breve, solo per radere pochi secondi allo spegnimento, dobbiamo installare un sacco di schifezze solo per terminare correttamente le nostre connessioni? Sul serio ? Questo sta diventando storto. Siamo condannati.
leucos,

3
Nota che il primo riavvio dopo l'installazione di libpam-systemd e dbus lascerebbe ancora in sospeso la sessione SSH. Per evitare ciò, invece di reboot, fai un shutdown -rvalore predefinito con un ritardo di 1 minuto, lasciandoti il ​​tempo di chiudere la sessione SSH.
martedì

9

Questo è qualcosa che devi impostare sul lato client, non sul lato server. Modifica il tuo ~/.ssh/configper contenere

ServerAliveInterval 15
ServerAliveCountMax 5

Ciò significa che dopo 15 secondi di inattività, il client invierà un messaggio al server. Se non riceve alcuna risposta, riproverà fino a 5 volte e quando non riceve ancora una risposta, chiuderà la sessione.


2
Ciò comporterà un ritardo di 75 secondi prima che il client ssh segnalasse che il server è morto. Giusto?
Vesper,

1
Sì, ed è possibile regolare i parametri per ridurre il timeout.
Tero Kilkanen,

Questo ha risolto il problema per me. Un problema così irritante.
Justin Andrusk,

5

Questo comportamento è riportato su questo Debian Bug , devi solo impostare correttamente gli script di shutdown forniti con il pacchetto perché, automaticamente, non vengono copiati di default:

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

1

Puoi specificare le opzioni di cui Jenny D ha parlato nella sua risposta solo per un comando ssh, come

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

se lo fai spesso, puoi scriverlo.


0

Funziona per me con lshd. Quindi la soluzione sarebbe

apt install lsh-server
apt remove openssh-server

0

purtroppo serverfault non mi ha lasciato rispondere nel thread causa di troppo pochi punti da anni. Ma non ho bisogno di spam in altri blog per ottenere lo sblocco ^^ ... quindi come risposta dedicata:

Come menzionato da Rfraile

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

lavori. Per utilizzarlo senza riavviare l'istanza / server, è necessario eseguire attività aggiuntive:

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

pertanto il servizio viene registrato e avviato e systemd deve arrestarlo per scopi di riavvio / arresto.


Quindi stai solo ripetendo un'altra risposta?
RalfFriedl

No? Ho usato le 2 righe solo come riferimento per la risposta superiore perché non posso ancora rispondere come scritto. Ho aggiunto i passaggi necessari per usarlo senza riavviare. Questo può essere dato anche in un'altra discussione ma che non ho ancora verificato.
Reiner030
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.