终止删除的 SSH 会话

mar*_*mnl 65 ssh

我的 SSH 会话似乎在下降,但这不是我的主要问题 - 主要问题是我以前的会话仍然存在,更糟糕的是其中一个会话正在运行,visudo阻止我访问它!

who 显示许多会话,除了我知道的当前会话已断开连接,如何终止旧会话以释放其资源?

Jen*_*y D 82

要解决当前的问题,即 sudoers 文件被锁定,您可以简单地删除锁定文件。它通常是`/etc/sudoers.tmp";检查visudo的手册页进行验证。如果删除锁定文件,则可以再次运行visudo。

要删除所有仍处于挂起状态的会话,首先要找出您自己当前会话的 pid。然后,如果你自己的pid是12345,做

ps -ef | grep sshd | grep -v -e grep -e root -e 12345 | awk '{print "sudo kill -9", $2}' | sh 
Run Code Online (Sandbox Code Playgroud)

您可能希望在没有最后| sh一个的情况下执行此操作,只是为了检查您计划杀死的 PID。

如果您使用的是 Linux,则可以改为使用

pkill -o -u $USER sshd
Run Code Online (Sandbox Code Playgroud)

杀死您最旧的 SSH 会话。继续这样做,直到您当前的会话成为唯一剩下的会话。

您可能还想设置ServerAliveInterval 15.ssh/config没有数据发送时每 15 秒发送一条 keepalive 消息。man ssh_config想要查询更多的信息。

  • 以 root 身份执行 `pkill -o -u $USER sshd` 是极其危险的!特别是当您无法物理访问服务器时。如果您多次执行此操作,您将无法通过 ssh 访问服务器。 (2认同)

小智 8

这将终止挂起 2 天以上的会话。它可以作为一个cron。

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

这将杀死除您的(最后一个活动会话)之外的所有内容。从终端运行它。

for i in `w|tail -n+3|awk '{print $2,$5}'|grep -v 0.00s|cut -d' ' -f1`; do fuser -k /dev/$i; done
Run Code Online (Sandbox Code Playgroud)