Завершить пропущенные сеансы SSH

47

Мои сеансы SSH, похоже, прекращаются, хотя это не моя главная проблема - главная проблема в том, что мои предыдущие сеансы все еще живы, еще хуже, хотя одна из них работает, не visudoдавая мне доступа к ней!

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

markmnl
источник
1
Если вы в порядке с уничтожением всего на определенном терминале, вы можете сделать что-то вроде fuser -k /dev/pts/0или любой другой терминал, который будет отображаться в whoвыводе. Немного странно, что все эти игнорируемые SIGHUP. Они работали на screenсессии или что-то?
Братчли
Я получаю: Не удалось убить процесс 1031: Нет такого процесса. ничего особенного, только использование SSH в PuTTY - я думаю, что мой новый маршрутизатор агрессивен в отбрасывании неактивных соединений - хотя я бы подумал, что другой конец сделал бы что-то, как только TCP-соединение завершится - возможно, он не знает (пока)?
markmnl
1
ОБНОВЛЕНИЕ, что команда работает для других пользователей (0 whoбольше нет), спасибо!
markmnl
«Кажется, мои сеансы SSH прекращаются ... главная проблема в том, что мои предыдущие сеансы все еще живы», - это немного противоречиво. Они либо были отключены, либо все еще подключены. Может быть, вам следует объяснить, как вы пришли к такому выводу, что вы были отключены, а затем снова подключиться и понять, что ваше старое соединение все еще работает.
Златовласка

Ответы:

58

Чтобы решить непосредственную проблему, что файл sudoers заблокирован, вы можете просто удалить файл блокировки. Обычно это `/etc/sudoers.tmp"; проверьте man-страницу для проверки visudo. Если вы удалите файл блокировки, вы можете снова запустить visudo.

Чтобы удалить все сеансы, которые все еще остаются в подвешенном состоянии, сначала найдите pid вашего текущего сеанса. Затем, если ваш собственный pid - 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чтобы послать сообщения KEEPALIVE каждые 15 секунд , когда никакие данные не были переданы. man ssh_configдля дополнительной информации.

Дженни Д
источник
1
В CentOS - если вы используете SSH для учетной записи root, этот ответ не будет работать, попробуйте использовать следующее: ps aux | grep ssh | grep -v / usr / sbin | awk '{print $ 2}' | xargs kill
Али Надализаде
Благодарю. Это работает. Мне неясно, для какой цели grep -v 12345служит часть синтаксиса? пройти все что не содержит 12345?
Лорд Ло.
grep -v 12345означает «удалить любое совпадение строк 12345из совпадения». Следовательно, вы должны сначала определить PID вашего собственного сеанса и использовать этот PID вместо 12345.
Дженни Д
После завершения всех таких сеансов и выхода в отставку, команды whoили topвсе равно показывает старое количество подписанных пользователей, даже оно должно показывать только 1. Как это можно принудительно обновить?
Омега
2

Если вы перечисляете процессы так, что видите их команды и аргументы (как, например, ps -fиз procps, то вы должны увидеть процессы 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=).

peterph
источник
1

Это убьет сессии, висящие на 2+ дня. Это можно поставить как cron.

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
Ужасный
источник