当前位置: 首页 > news >正文

Linux 系统中,重启 ssh 服务时,为什么现有的 ssh 会话不会断开

Linux 系统中,重启 ssh 服务时,为什么现有的 ssh 会话不会断开

SSH 是基于 TCP 的应用层协议(默认端口号是 22),Linux 中通常由 OpenSSH 实现。

OpenSSH 采用的是 “一连接一进程” 的模型,意思就是 客户端 和 服务端三次握手建立连接后,服务端会 fork(复制)一个子进程,由这个子进程负责这个客户端和服务端之间的交互。后续的协议处理数据交互就由这个子进程处理。

sshd (监听进程)├─ sshd (客户端1)├─ sshd (客户端2)└─ sshd (客户端3)

所以就把主进程(监听进程)停止后,只要子进程还在,就不会影响到现有已建立的 SSH 会话,影响的只是新的 ssh 连接不能建立了而已。

使用 systemd 的 service 托管 OpenSSH 服务时,可以发现有一项配置为: KillMode=process(只终止主进程),systemd 在停止主进程时,不会将子进程一起给 KILL 掉,因此在大多数情况下,停止或重启 ssh 服务不会影响现有的 ssh 会话。

若不指定 KillMode,默认 KillMode=control-group,通过 systemd 托管的进程,ystemd 会给每个进程分配一个 CGroup。该进程及其子进程全都是包含在这个 CGroup 里面,一旦重启或者停止,所有Cgroup 中的进程都会被 KILL 掉。

所以若不指定 KillMode,则重启或停止ssh 服务时可能会导致现有的 ssh 会话连接断开。