Terminar sesiones SSH caídas

47

Mis sesiones de SSH parecen estar cayendo, aunque ese no es mi problema principal: el problema principal es que mis sesiones anteriores todavía están vivas, peor aún, una de ellas se está ejecutando ¡ visudoevitando que acceda a ellas!

who muestra una cantidad de sesiones, todas excepto la actual que sé que se ha desconectado, ¿cómo puedo finalizar las antiguas para liberar sus recursos?

markmnl
fuente
1
Si está de acuerdo con matar todo en un terminal en particular, podría hacer algo como fuser -k /dev/pts/0lo que sea que aparezca el terminal en la whosalida. Sin embargo, un poco raro todos esos SIGHUP ignorados. ¿Estaban corriendo en una screensesión o algo así?
Bratchley
Obtengo: No se pudo matar el proceso 1031: No existe ese proceso. nada especial solo SSH'd al usar PuTTY: creo que mi nuevo enrutador es agresivo al desconectar conexiones inactivas, aunque hubiera pensado que el otro extremo habría hecho algo una vez que la conexión TCP termine, ¿tal vez no lo sabe (todavía)?
markmnl
1
ACTUALIZA ese comando está funcionando para los otros usuarios (0 ya no está who), ¡gracias!
markmnl
"Sin embargo, mis sesiones de SSH parecen estar cayendo ... el problema principal es que mis sesiones anteriores todavía están vivas" es un poco contradictorio. Se han desconectado o todavía están conectados. Tal vez debería explicar cómo ha llegado a esta conclusión, de modo que se haya desconectado y luego vuelva a conectarse y se dé cuenta de que su conexión anterior todavía se está ejecutando.
Ricitos de oro

Respuestas:

58

Para resolver el problema inmediato, que el archivo sudoers está bloqueado, simplemente puede eliminar el archivo de bloqueo. Por lo general, será `/etc/sudoers.tmp"; revise la página del manual para verudo para verificar. Si elimina el archivo de bloqueo, puede volver a ejecutar visudo.

Para eliminar todas las sesiones que aún quedan pendientes, primero averigüe el pid de su propia sesión actual. Entonces, si tu propio pid es 12345, haz

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

Es posible que desee hacerlo sin el último final | shsolo para verificar los PID que planea matar.

Si estás en Linux, puedes usar

pkill -o -u YOURUSERNAME sshd

matar tu sesión SSH más antigua. Continúe haciendo eso hasta que su sesión actual sea la única que quede.

También es posible que desee configurar ServerAliveInterval 15en .ssh/configenviar un mensaje de alerta cada 15 segundos cuando no se hayan enviado datos. man ssh_configpara más información.

Jenny D
fuente
1
En CentOS: si está utilizando SSH en la cuenta raíz, esta respuesta no funcionará, intente usar lo siguiente: ps aux | grep ssh | grep -v / usr / sbin | awk '{print $ 2}' | xargs kill
Ali Nadalizadeh
Gracias. Esto funciona. No tengo claro cuál es el propósito de grep -v 12345parte de la sintaxis. pasar todo lo que no contiene 12345?
Lord Loh
grep -v 12345significa "eliminar cualquier línea que coincida 12345con la coincidencia". Por lo tanto, primero debe identificar el PID de su propia sesión y usar ese PID en lugar de 12345.
Jenny D
Después de matar todas esas sesiones y renunciar, ordenar whoo topaún mostrar el número antiguo de usuarios firmados, incluso debería mostrar solo 1. ¿Cómo se puede forzar a que se actualice?
Ωmega
2

Si enumera los procesos para ver sus comandos y argumentos (como, por ejemplo, ps -fde procps), debería ver los procesos sshd llamados, por ejemplo:

sshd: user@pts/7

El terminal ( pts/7) es la parte clave aquí: si lo compara con su terminal actual ( tty), puede ver cuál es su sesión activa. Por supuesto, hay otras formas de hacerlo (como mirar el PID del shell actualmente en ejecución y ubicarlo en el árbol de procesos), pero esta es probablemente la más fácil. Luego puede usar algo en estas líneas:

# 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.*//"

Luego puede alimentar los PID para matar, xargspero siempre asegúrese de no matar el sshdproceso principal que maneja las nuevas conexiones .

En una nota relacionada, tenga en cuenta que, en general, la pssalida de análisis es propensa a errores (especialmente en varios sistemas) debido a la variabilidad de sus formatos de salida (aquí mitigados en gran medida por el uso de -o pid= -o command=).

Peterph
fuente
1

Esto matará las sesiones suspendidas por más de 2 días. Se podría poner como un cron.

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

Esto matará a todos menos a tu (última sesión activa). Ejecuta esto desde la 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
Escalofriante
fuente