终止已删除的 SSH 会话

终止已删除的 SSH 会话

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

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

答案1

要解决 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 

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

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

pkill -o -u $USER sshd

终止最旧的 SSH 会话。继续这样做,直到只剩下当前会话。

您可能还需要设置为ServerAliveInterval 15.ssh/config没有发送数据时每 15 秒发送一条保活消息。man ssh_config了解更多信息。

答案2

这将终止挂起 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

答案3

如果您列出进程以便看到它们的命令和参数(例如ps -f来自 procps 的操作),您应该会看到 sshd 进程,例如:

sshd: user@pts/7

终端 ( pts/7) 是这里的关键部分 - 如果将其与当前终端 ( tty) 进行比较,您可以看到哪个是您的活动会话。当然还有其他方法可以做到这一点(例如查看当前正在运行的 shell 的 PID 并在进程树中找到该 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=),解析输出通常很容易出错(尤其是在各种系统中)。

相关内容