20 votes

Les sessions SSH se bloquent lors de l'arrêt/redémarrage

J'ai un serveur sur lequel tourne Debian et sshd, et dans le cas où je dois redémarrer le serveur, ma session SSH se bloque côté client jusqu'à ce que TCP timeout. Je suppose que cela est dû au fait que lorsque sshd se termine, il ne ferme pas explicitement les sessions SSH ouvertes sur l'hôte. Que dois-je faire pour que sshd déconnecte d'abord tout le monde, puis se termine normalement ? Jusqu'à présent, je ne vois pas de paramètre dans man sshd_config qui est lié au comportement de fermeture.

38voto

asad_hussain Points 103

Lorsque vous arrêtez ou redémarrez votre système, systemd tente d'arrêter tous les services aussi vite qu'il le peut. Cela implique l'arrêt du réseau et l'arrêt de tous les processus encore en vie, généralement dans cet ordre. Ainsi, lorsque systemd tue les processus SSH forkés qui gèrent vos sessions SSH, la connexion réseau est déjà désactivée et ils n'ont aucun moyen de fermer la connexion client de manière élégante.

Votre première pensée pourrait être de tuer tous les processus SSH lors de la première étape de l'arrêt, et il existe plusieurs fichiers de service systemd qui font exactement cela.

Mais il existe bien sûr une solution plus nette (la façon dont cela est "censé" être fait) : systemd-logind .
systemd-logind garde la trace des sessions utilisateur actives (locales et SSH) et assigne tous les processus créés à l'intérieur de celles-ci à des "tranches". De cette façon, lorsque le système est arrêté, systemd peut simplement SIGTERM tout ce qui se trouve dans les tranches d'utilisateurs (y compris le processus SSH forké qui gère une session particulière) et continuer à arrêter les services et le réseau.

systemd-logind nécessite un module PAM pour être notifié des nouvelles sessions d'utilisateurs et vous aurez besoin de dbus à utiliser loginctl pour vérifier son état, alors installez-les tous les deux :

apt-get install libpam-systemd dbus

Assurez-vous que votre /etc/ssh/sshd_config va en fait utiliser le module avec UsePAM yes .

11voto

Jenny D Points 26978

Il s'agit d'un paramètre à définir du côté du client, et non du côté du serveur. Modifiez votre ~/.ssh/config pour contenir

ServerAliveInterval 15
ServerAliveCountMax 5

Cela signifie qu'après 15 secondes d'inactivité, votre client enverra un message au serveur. S'il ne reçoit pas de réponse, il réessayera jusqu'à 5 fois, et s'il n'obtient toujours pas de réponse, il fermera la session.

11voto

widmore Points 19

Ce comportement est rapporté sur ce site Bug Debian Il suffit de configurer correctement les scripts de fermeture livrés avec le paquet car, automatiquement, ils ne sont pas copiés par défaut :

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

2voto

Diego Medaglia Points 53

Vous pouvez spécifier les options dont Jenny D a parlé dans sa réponse pour une seule commande ssh, par exemple

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

si vous le faites souvent, vous pouvez script.

2voto

Reiner030 Points 63

Malheureusement, le défaut de serveur ne m'a pas permis de répondre dans le fil de discussion causé par un nombre insuffisant de points depuis des années. Mais je n'ai pas besoin de spammer sur d'autres blogs pour obtenir le déblocage ^^... donc comme réponse dédiée :

Comme l'a mentionné Rfraile

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

œuvre. Pour l'utiliser sans redémarrer l'instance/le serveur, vous devez effectuer des tâches supplémentaires :

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

ainsi le service est enregistré et démarré et systemd a besoin de l'arrêter pour les besoins du redémarrage/arrêt.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X