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.
Réponses
Trop de publicités?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
.
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.
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
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.
- Réponses précédentes
- Plus de réponses