我正在开发一些代码,以便通过 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
.