Zakończ przerwane sesje SSH

47

Moje sesje SSH wydają się spadać, chociaż to nie jest mój główny problem - głównym problemem jest to, że moje poprzednie sesje wciąż żyją, gorzej, ale jedna z nich działa, visudouniemożliwiając mi dostęp do nich!

who pokazuje liczbę wszystkich sesji oprócz mojej obecnej, o której wiem, że się rozłączyłem, jak mogę zakończyć stare, aby zwolnić ich zasoby?

markmnl
źródło
1
Jeśli nie masz nic przeciwko zabiciu wszystkiego na danym terminalu, możesz zrobić coś takiego fuser -k /dev/pts/0lub cokolwiek, co pojawi się na whowyjściu. Jednak trochę dziwne, że wszyscy ignorowali SIGHUP. Czy biegali w screensesji czy coś?
Bratchley
Rozumiem: nie można zabić procesu 1031: Nie ma takiego procesu. nic specjalnego tylko SSH w korzystaniu z PuTTY - myślę, że mój nowy router jest agresywny w usuwaniu nieaktywnych połączeń - choć myślałem, że drugi koniec zrobiłby coś, gdy połączenie TCP się zakończy - może nie wie (jeszcze)?
markmnl
1
ZAKTUALIZUJ to polecenie działa dla innych użytkowników (0 whojuż nie), dzięki!
markmnl
„Wydaje się, że moje sesje SSH spadają… głównym problemem jest to, że moje poprzednie sesje wciąż żyją” jest trochę sprzeczne. Zostały rozłączone lub nadal są połączone. Może powinieneś wyjaśnić, w jaki sposób doszedłeś do takiego wniosku, że zostałeś rozłączony, a następnie połącz się ponownie i zdaj sobie sprawę, że twoje stare połączenie nadal działa.
złotowłosa

Odpowiedzi:

58

Aby rozwiązać natychmiastowy problem, że plik sudoers jest zablokowany, możesz po prostu usunąć plik blokady. Zwykle będzie to `/etc/sudoers.tmp"; sprawdź stronę podręcznika, aby sprawdzić visudo. Jeśli usuniesz plik blokady, możesz ponownie uruchomić visudo.

Aby usunąć wszystkie sesje, które nadal pozostają zawieszone, najpierw sprawdź numer pid bieżącej sesji. Następnie, jeśli twój własny pid to 12345, zrób

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

Możesz to zrobić bez ostatniego, | shtylko po to, aby sprawdzić PID, które planujesz zabić.

Jeśli korzystasz z systemu Linux, możesz zamiast tego użyć

pkill -o -u YOURUSERNAME sshd

zabić swoją najstarszą sesję SSH. Kontynuuj robienie tego, dopóki nie pozostanie Ci tylko bieżąca sesja.

Możesz również ustawić ServerAliveInterval 15w twojej .ssh/configposłać keepalive wiadomość co 15 sekund, gdy dane nie została wysłana. man ssh_configpo więcej informacji.

Jenny D.
źródło
1
W CentOS - jeśli korzystasz z SSH do konta root, ta odpowiedź nie zadziała, spróbuj użyć następujących opcji: ps aux | grep ssh | grep -v / usr / sbin | awk „{print $ 2} '| xargs kill
Ali Nadalizadeh
Dzięki. To działa. Nie jestem pewien, do czego służy grep -v 12345część składni? przekazać wszystko, co nie zawiera 12345?
Lord Loh.
grep -v 12345oznacza „usuń dowolne pasujące wiersze 12345z dopasowania”. Dlatego najpierw należy zidentyfikować PID własnej sesji i użyć tego PID zamiast 12345.
Jenny D,
Po zabiciu wszystkich takich sesji i rezygnacji, polecenia wholub topwciąż pokazuje starą liczbę podpisanych użytkowników, nawet powinna pokazywać tylko 1. W jaki sposób można to zmusić do odświeżenia?
Ωmega
2

Jeśli wyświetlasz listę procesów tak, abyś zobaczył ich polecenia i argumenty (jak np. ps -fZ procps robi), powinieneś zobaczyć procesy sshd o nazwie np .:

sshd: user@pts/7

Terminal ( pts/7) jest tutaj kluczową częścią - jeśli porównasz go z obecnym terminalem ( tty), możesz zobaczyć, która jest twoja aktywna sesja. Istnieją oczywiście inne sposoby (np. Sprawdzenie PID aktualnie działającej powłoki i zlokalizowanie jej w drzewie procesów), ale jest to prawdopodobnie najłatwiejszy. Następnie możesz użyć czegoś w następujący sposób:

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

Następnie możesz podać PID do zabicia, xargsale zawsze upewnij się, że nie zabijesz głównego sshdprocesu, który obsługuje nowe połączenia .

W powiązanej uwadze, należy pamiętać, że dość ogólnie parsowanie psdanych wyjściowych jest podatne na błędy (szczególnie w różnych systemach) ze względu na zmienność formatów wyjściowych (tutaj w dużym stopniu ograniczonych przez użycie -o pid= -o command=).

Peter
źródło
1

Zabije to zawieszanie sesji przez ponad 2 dni. Można to określić jako cron.

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

Zabije to wszystkich oprócz twojej (ostatniej aktywnej sesji). Uruchom to z terminala.

for i in `w|tail -n+3|awk '{print $2,$5}'|grep -v 0.00s|cut -d' ' -f1`; do fuser -k /dev/$i; done
Straszny
źródło