这是整个场景:
- 安装 ssh apt-get install ssh
- 创建了一个新用户(我知道我不必这样做)
- 使用新用户通过 ssh 登录系统
- 修改/etc/ssh/sshd_config以允许root登录
- 发出命令 systemctl status ssh
- 它显示服务正在运行
- 发出 systemctl stop ssh (我知道我可以使用 service cmd)
- 我仍然通过 ssh 登录!不知道这是如何运作的
- 打开一个新的 putty 实例并尝试连接,它说服务无法访问/超时
- 发出 systemctl start ssh 并尝试使用新的 putty 实例以用户身份登录,并且成功
我想知道为什么它没有拆除第一个实例(新用户通过 ssh 登录)?是因为当我最初登录时,ssh 接受了端口 22 上的连接并打开了一个新的 Web 套接字端口(多线程)并将我的连接分配给该端口,并且正在侦听端口 22 上的另一个连接,当我登录时停止服务后它说超时?
我确信 ssh 不会跟踪它打开的随机端口,你会说这可能是一个错误(没有损坏)。 C 程序不应该也跟踪 ssh 并在 ssh 服务停止时删除实例吗?有什么想法吗?
答案1
这是故意的。当您使用 SSH 连接到系统时,目标系统上的守护进程会生成一个新sshd
进程,甚至两个进程(一个以 运行root
,另一个以目标用户运行)。 SSH 会话是由这个新进程处理的,而不是原来的进程。从联机帮助页:
sshd
监听来自客户端的连接。它通常在引导时启动/etc/init.d/ssh
(或/etc/init/ssh.conf
在使用 Upstart init 守护进程的系统上)。它为每个传入连接创建一个新的守护进程。分叉的守护进程处理密钥交换、加密、身份验证、命令执行和数据交换。
当您停止服务时,只有主守护进程停止;管理会话的守护进程继续运行。这使您能够在不丢失会话的情况下重新启动 SSH 服务器 - 当您配置错误且服务器无法重新启动时,这尤其方便......