如何结束/终止所有传入的 SSH 连接?

如何结束/终止所有传入的 SSH 连接?

我正在开发一些代码,以便通过 SSH 在 PC 和 Raspberry Pi 之间进行通信。当 PC 打开与 RPi 的 SSH 连接时,RPi 屏幕上会弹出一个带有短消息的窗口。当没有打开的 SSH 连接时,该窗口会自行关闭。到目前为止一切都很好。

现在,我想在 RPi 上的所述窗口中添加一个按钮,以终止所有 SSH 传入连接。有没有 Unix 命令可以做到这一点?执行此操作的 Python 模块或方法也很好,因为 RPi 的代码是用 Python 编写的。

根据我的研究,终止 SSH 连接可以通过通过 PID 杀死相应的进程来完成。由于我想自主终止所有 SSH 进程/连接,因此我正在寻找更简单的解决方案。

感谢您的帮助!

(Raspberry Pi 在 Raspbian 8 上运行(jessie))

答案1

pkill如果你有/ ,那么杀死所有 SSH 服务器进程并不难pgrep,只需运行pkill sshd。问题在于将主 SSH 守护进程与每个连接的守护进程分开,并让该守护进程保持活动状态。

一个简单的解决方法是关闭服务器,终止剩余的每个连接进程,然后重新启动服务器,例如在 systemd 系统上:

systemctl stop sshd
pkill sshd
systemctl start sshd

或者,考虑到sshd可能设置为写入 PID 文件,我们可以从那里读取主进程的 PID,然后跳过它。在我的带有 systemd 的 Debian 上,它是写入的,/run/sshd.pid但可以/etc/ssh/sshd_config使用选项将其设置为其他内容PidFile

pgrep每行输出一个 PID,因此我们可以使用它grep来删除具有主 PID 的行(grep -x应该用于避免部分匹配):

#!/bin/bash
mainpid=$(cat /run/sshd.pid)
pids=$(pgrep sshd | grep -vxe "$mainpid")
kill $pids

不带引号的扩展$pids在空格上分割字符串,以便kill单独获取 PID。

您必须将其运行为root,因为实际上每个连接有两个进程:一个作为 运行root,一个作为登录用户运行。或者,如果您只想终止sshd 用户拥有的进程,请使用pgrep -u username sshd.

相关内容