Termine les sessions SSH abandonnées

47

Mes sessions SSH semblent être en train de tomber, bien que ce ne soit pas mon problème majeur. Le problème majeur est que mes précédentes sessions sont toujours vivantes. Pire, l'une d'entre elles est en cours d'exécution, visudom'empêchant d'y accéder!

who montre un certain nombre de sessions, à l'exception de la session actuelle dont je sais qu'elles sont déconnectées, comment puis-je mettre fin aux anciennes pour que leurs ressources soient libérées?

markmnl
la source
1
Si tout va bien pour tout détruire sur un terminal particulier, vous pouvez faire quelque chose du genre fuser -k /dev/pts/0ou quel que soit le type de terminal qui apparaît dans la whosortie. Un peu bizarre tous ceux qui ont ignoré SIGHUP, cependant. Ont-ils couru dans une screensession ou quelque chose?
Bratchley
J'ai: Impossible de tuer le processus 1031: Aucun processus de ce type. Rien de spécial juste SSH dans l'utilisation de PuTTY - je pense que mon nouveau routeur est agressif en abandonnant les connexions inactives - bien que j'aurais pensé que l'autre extrémité aurait fait quelque chose une fois la connexion TCP terminée - peut-être qu'il ne sait pas (encore)?
Markmnl
1
UPDATE cette commande fonctionne pour les autres utilisateurs (0 plus dans who), merci!
Markmnl
"Mes sessions SSH semblent être en train de chuter ... le problème majeur est que mes précédentes sessions sont toujours en vie" est un peu contradictoire. Ils ont été déconnectés ou sont toujours connectés. Peut-être devriez-vous expliquer comment vous en êtes arrivé à cette conclusion, de sorte que vous êtes déconnecté, puis reconnectez-vous et réalisez que votre ancienne connexion est toujours en cours d'exécution.
goldilocks

Réponses:

58

Pour résoudre le problème immédiat, à savoir que le fichier sudoers est verrouillé, vous pouvez simplement supprimer le fichier verrouillé. Il s’agit généralement de «/etc/sudoers.tmp»; consultez la page de manuel relative à visudo. Si vous supprimez le fichier de verrouillage, vous pouvez exécuter à nouveau visudo.

Pour supprimer toutes les sessions encore en suspens, commencez par connaître le pid de votre propre session en cours. Ensuite, si votre propre pid est 12345, faites

ps -ef | grep sshd | grep -v root | grep -v 12345 | grep -v grep | awk '{print "sudo kill -9", $2}' |sh 

Vous voudrez peut-être le faire sans le | shpremier final simplement pour vérifier les PID que vous prévoyez tuer.

Si vous êtes sous Linux, vous pouvez plutôt utiliser

pkill -o -u YOURUSERNAME sshd

pour tuer votre session SSH la plus ancienne. Continuez ainsi jusqu'à ce que votre session en cours soit la seule disponible.

Vous pouvez également définir ServerAliveInterval 15votre .ssh/configenvoyer un message keepalive toutes les 15 secondes lorsque aucune donnée n'a été transmise. man ssh_configpour plus d'informations.

Jenny D
la source
1
Sur CentOS - Si vous êtes sous SSH sur un compte root, cette réponse ne fonctionnera pas, essayez ce qui suit: ps aux | grep ssh | grep -v / usr / sbin | awk '{print $ 2}' | xargs kill
Ali Nadalizadeh
Merci. Cela marche. Je ne sais pas à quoi sert une grep -v 12345partie de la syntaxe? passer tout ce qui ne contient pas 12345?
Seigneur Loh.
grep -v 12345signifie "supprimer toute correspondance 12345de la correspondance". Par conséquent, vous devez d'abord identifier le PID de votre propre session et utiliser ce PID à la place de 12345.
Jenny D
Après avoir tué toutes ces sessions et démissionné, des commandes whoou topaffiche toujours l'ancien nombre d'utilisateurs signés, même si cela devrait en montrer seulement un. Comment peut-on forcer l'actualisation?
Ωmega
2

Si vous ps -flistez les processus de manière à voir leurs commandes et leurs arguments (comme par exemple chez procps), vous devriez voir les processus sshd appelés par exemple:

sshd: user@pts/7

Le terminal ( pts/7) est la partie clé ici - si vous le comparez avec votre terminal actuel ( tty), vous pouvez voir quelle est votre session active. Il existe bien sûr d'autres moyens de le faire (par exemple, regarder le PID du shell en cours d'exécution et le localiser dans l'arbre des processus), mais c'est probablement le plus simple. Vous pouvez ensuite utiliser quelque chose dans ce sens:

# current tty name
TTY=$(tty | cut -f3- -d/)
# PIDs of other sshd processes
ps -o pid= -o command= -C sshd \
    | grep sshd:.*@ \
    | grep -v "@$TTY" \
    | sed "s/ sshd.*//"

Vous pouvez ensuite alimenter les PID avec lesquels tuer, xargsmais assurez-vous toujours de ne pas tuer le sshdprocessus principal qui gère les nouvelles connexions .

Sur une note connexe, sachez qu’en règle générale, l’analyse de la pssortie est source d’erreurs (en particulier sur différents systèmes) en raison de la variabilité de ses formats de sortie (atténuée dans une large mesure par l’utilisation de -o pid= -o command=).

Peterph
la source
1

Cela supprimera les sessions pendant plus de 2 jours. Il pourrait être mis comme un cron.

for i in `w|awk '{print $2,$5}'|grep days|cut -d' ' -f1`; do fuser -k /dev/$i; done

Cela tuera tout sauf votre (dernière session active). Exécutez ceci depuis le terminal.

for i in `w|tail -n+3|awk '{print $2,$5}'|grep -v 0.00s|cut -d' ' -f1`; do fuser -k /dev/$i; done
Effrayant
la source