Скасувати відмовлені сеанси SSH


47

Мої сеанси SSH, здається, припиняються, хоча це не є моєю основною проблемою - головна проблема в тому, що мої попередні сеанси все ще живі, ще гірше, але один з них працює, visudoзаважаючи мені отримати доступ до нього!

who показує ряд сеансів усіх, крім мого поточного, якого я знаю, відключився, як я можу припинити старі, щоб звільнити їх ресурси?


1
Якщо ви все гаразд, вбиваючи все на певному терміналі, ви можете зробити щось на кшталт fuser -k /dev/pts/0або будь-який інший термінал, що з’являється у whoвисновку. Хоча трохи дивно всі ці ігнорували SIGHUP. Вони бігали на screenсесії чи щось таке?
Братчлі

Я отримую: Не вдалося вбити процес 1031: Такого процесу немає. нічого особливого просто SSH не використовував PuTTY - я думаю, мій новий маршрутизатор є агресивним у відмові від неактивних з'єднань - хоча я б подумав, що інший кінець зробить щось, як тільки TCP-з'єднання припиняється - можливо, воно не знає (поки що)?
markmnl

1
ОНОВЛЕННЯ, що ця команда працює для інших користувачів (більше 0 who), дякую!
markmnl

"Мої сеанси SSH, здається, припиняються, хоча ... основна проблема полягає в тому, що мої попередні сесії все ще живі" є трохи суперечливим. Вони або відключені, або все ще підключені. Можливо, ви повинні пояснити, як ви дійшли такого висновку, щоб ви відключилися, потім підключіться ще раз і зрозумієте, що ваше старе з'єднання все ще працює.
золотинок

Відповіді:


58

Щоб вирішити негайну проблему, що файл sudoers заблокований, ви можете просто видалити файл блокування. Зазвичай це буде `/etc/sudoers.tmp"; перевірте головну сторінку на наявність візуалу, щоб перевірити. Якщо ви видалите файл блокування, ви можете запустити візуально ще раз.

Щоб видалити всі сеанси, які все ще залишаються висячими, спочатку дізнайтеся сторінку власного поточного сеансу. Потім, якщо ваш власний під 12345, зробіть

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

Ви можете зробити це без останнього, | shщоб перевірити PID, які ви плануєте вбити.

Якщо ви працюєте в Linux, ви можете замість цього використовувати

pkill -o -u YOURUSERNAME sshd

щоб вбити найстаріший сеанс SSH. Продовжуйте робити це, поки не залишиться лише ваш поточний сеанс.

Ви також можете встановити ServerAliveInterval 15у своєму .ssh/configповідомленні відправляти повідомлення про збереження кожні 15 секунд, коли жодних даних не надсилається. man ssh_configдля отримання додаткової інформації.


1
У CentOS - якщо ви SSH з кореневим обліковим записом, ця відповідь не буде працювати, спробуйте скористатися наступним: ps aux | grep ssh | grep -v / usr / sbin | awk '{print $ 2}' | xargs kill
Ali Nadalizadeh

Дякую. Це працює. Мені незрозуміло, якою метою grep -v 12345служить частина синтаксису? передавати все, що не містить 12345?
Лорд Лох.

grep -v 12345означає "видалити будь-яку відповідність рядка 12345з відповідності". Отже, спочатку слід ідентифікувати PID вашого власного сеансу та використовувати цей PID замість 12345.
Дженні Д

Після вбивства всіх таких сеансів і відставки, командування whoабо topвсе ще показує стару кількість підписаних користувачів, навіть це повинно показувати лише 1. Як це можна змусити оновитись?
Оммега

2

Якщо ви перераховуєте процеси так, щоб ви бачили їх команди та аргументи (як, наприклад, ps -fз procps does), ви повинні побачити тоді sshd процеси, що називаються, наприклад:

sshd: user@pts/7

Тут pts/7є ключовою частиною термінал ( ) - якщо порівнювати його з поточним терміналом ( tty), ви можете бачити, який ваш активний сеанс. Звичайно, це є й інші способи (наприклад, перегляд PID поточно запущеної оболонки та пошук цього в дереві процесу), але це, мабуть, найпростіший. Потім ви можете використовувати щось за цими лініями:

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

Потім ви можете годувати PID-адреси, щоб знищити, xargsале завжди переконайтеся, що ви не вбиваєте основний sshdпроцес, який обробляє нові з'єднання .

У відповідній примітці слід зазначити, що в цілому синтаксичний аналіз psрезультатів спричинений помилками (особливо в різних системах) через мінливість його вихідних форматів (тут значною мірою пом'якшується використанням -o pid= -o command=).


1

Це призведе до вбивства сеансів, що висять протягом 2+ днів. Його можна поставити як крон.

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

Це знищить усіх, крім вашого (останній активний сеанс). Запустити це з терміналу.

for i in `w|tail -n+3|awk '{print $2,$5}'|grep -v 0.00s|cut -d' ' -f1`; do fuser -k /dev/$i; done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.