终止丢弃的SSH会话


47

我的SSH会话似乎正在中断,尽管这不是我的主要问题-主要问题是我以前的会话仍然有效,但更糟糕的是其中一个正在运行,visudo阻止了我对其的访问!

who 显示了多个会话,除了我知道的当前会话已断开连接之外,所有会话都该如何连接?如何终止旧会话,从而释放它们的资源?


1
如果您可以杀死特定终端上的所有内容,那么可以执行类似的操作,fuser -k /dev/pts/0或者在who输出中显示任何终端。但是,所有那些忽略了SIGHUP的人都有些奇怪。他们是在screen会话中运行还是其他?
布拉奇利2014年

我得到:无法终止进程1031:没有这样的进程。SSH在使用PuTTY时没什么特别的-我认为我的新路由器在删除不活动的连接方面很积极-尽管我认为一旦TCP conn终止,另一端会做一些事情-也许还不知道(还)?
markmnl 2014年

1
更新该命令对其他用户有效(0 who不再可用),谢谢!
markmnl 2014年

“尽管我的SSH会话似乎正在中断……主要问题是我以前的会话仍然存在”,这有点矛盾。它们要么已断开连接,要么仍处于连接状态。也许您应该解释一下您是如何得出此结论的,以便断开连接然后再次连接,并意识到您的旧连接仍在运行。
goldilocks 2014年

Answers:


58

为了解决紧迫的问题,sudoers文件被锁定,您可以简单地删除该锁定文件。通常是“ /etc/sudoers.tmp”;检查手册页以查看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没有数据发送时每15秒发送一次保持活动消息。man ssh_config欲获得更多信息。


1
在CentOS上-如果您要通过SSH登录到root帐户,则此答案将无效,请尝试使用以下命令: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
珍妮D

杀死所有此类会话并辞职后,命令whotop仍显示旧的已签名用户数,甚至应仅显示1。如何强制刷新?
Ωmega

2

如果您列出进程以便可以看到它们的命令和参数(例如ps -fprocps一样),则应该看到sshd进程,例如:

sshd: user@pts/7

终端(pts/7)是此处的关键部分-如果将其与当前终端(tty)进行比较,则可以看到哪个是您的活动会话。当然,还有其他方法可以做到这一点(例如查看当前正在运行的shell的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天以上的会话。它可以作为一个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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.