Termina le sessioni SSH rilasciate


47

Le mie sessioni SSH sembrano essere in calo anche se questo non è il mio problema principale - il problema principale è che le mie sessioni precedenti sono ancora in vita, peggio ancora una di queste è in esecuzione visudoimpedendomi di accedervi!

who mostra un numero di sessioni tutte tranne quella corrente che conosco abbiano disconnesso, come posso terminare quelle vecchie in modo da liberare le loro risorse?


1
Se stai bene uccidendo tutto su un particolare terminale, potresti fare qualcosa di simile fuser -k /dev/pts/0o qualunque terminale si presenti whonell'output. Un po 'strano, però, tutti quelli ignorati da SIGHUP. Stavano correndo in una screensessione o qualcosa del genere?
Bratchley,

Ottengo: impossibile uccidere il processo 1031: nessun processo del genere. niente di speciale solo SSH nell'usare PuTTY - penso che il mio nuovo router sia aggressivo nel far cadere le connessioni inattive - anche se avrei pensato che l'altra estremità avrebbe fatto qualcosa una volta terminato il conn TCP - forse non lo sa (ancora)?
markmnl

1
AGGIORNA quel comando funziona per gli altri utenti (0 non whopiù), grazie!
markmnl

"Tuttavia, le mie sessioni SSH sembrano essere in calo ... il problema principale è che le mie sessioni precedenti sono ancora vive" è un po 'contraddittorio. Sono stati disconnessi o sono ancora connessi. Forse dovresti spiegare come hai raggiunto questa conclusione in modo tale da essere stato disconnesso, quindi riconnettiti e renditi conto che la tua vecchia connessione è ancora in esecuzione.
Riccioli d'oro,

Risposte:


58

Per risolvere il problema immediato, che il file sudoers è bloccato, è possibile semplicemente eliminare il file di blocco. Di solito sarà `/etc/sudoers.tmp"; controlla la pagina man per verificare visudo. Se elimini il file di blocco, puoi eseguire di nuovo visudo.

Per eliminare tutte le sessioni che rimangono ancora sospese, per prima cosa scopri il pid della tua sessione corrente. Quindi, se il tuo pid è 12345, fallo

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

Potresti voler farlo senza il | shprimo finale solo per controllare i PID che stai pianificando di uccidere.

Se sei su Linux, puoi invece usare

pkill -o -u YOURUSERNAME sshd

per uccidere la tua sessione SSH più vecchia. Continuare a farlo fino a quando la sessione corrente è l'unica rimasta.

Potresti anche voler impostare il ServerAliveInterval 15tuo .ssh/configper inviare un messaggio keepalive ogni 15 secondi quando non sono stati inviati dati. man ssh_configper maggiori informazioni.


1
Su CentOS - Se stai eseguendo SSH sull'account di root, questa risposta non funzionerà, prova a utilizzare quanto segue: ps aux | grep ssh | grep -v / usr / sbin | awk '{print $ 2}' | xargs kill
Ali Nadalizadeh,

Grazie. Questo funziona Non sono chiaro a quale scopo grep -v 12345serva parte della sintassi? passare tutto ciò che non contiene 12345?
Lord Loh.

grep -v 12345significa "rimuovi qualsiasi corrispondenza di riga 12345dalla corrispondenza". Quindi, dovresti prima identificare il PID della tua sessione e usare quel PID invece di 12345.
Jenny D,

Dopo aver ucciso tutte queste sessioni e rassegnato le dimissioni, i comandi whoo topmostra ancora il vecchio numero di utenti firmati, anche questo dovrebbe mostrare solo 1. Come può essere forzato ad essere aggiornato?
Ωmega

2

Se elenchi i processi in modo da vedere i loro comandi e argomenti (come ad esempio ps -fda procps), dovresti vedere i processi sshd chiamati ad esempio:

sshd: user@pts/7

Il terminale ( pts/7) è la parte chiave qui - se lo confronti con il tuo terminale corrente ( tty), puoi vedere qual è la tua sessione attiva. Esistono ovviamente altri modi per farlo (come guardare il PID della shell attualmente in esecuzione e individuare quella nella struttura del processo), ma questa è probabilmente la più semplice. È quindi possibile utilizzare qualcosa in questo modo:

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

È quindi possibile alimentare i PID con cui uccidere, xargsma assicurarsi sempre di non interrompere il sshdprocesso principale che gestisce le nuove connessioni .

In una nota correlata, tieni presente che, in generale, l'analisi psdell'output è soggetta a errori (soprattutto tra vari sistemi) a causa della variabilità dei suoi formati di output (qui mitigata in larga misura dall'uso di -o pid= -o command=).


1

Questo ucciderà le sessioni sospese per 2+ giorni. Potrebbe essere messo come cron.

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

Questo ucciderà tutti tranne la tua (ultima sessione attiva). Esegui questo dal terminale.

for i in `w|tail -n+3|awk '{print $2,$5}'|grep -v 0.00s|cut -d' ' -f1`; do fuser -k /dev/$i; done
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.