![为什么 sshd 每个客户端有 2 个进程?](https://linux22.com/image/1615898/%E4%B8%BA%E4%BB%80%E4%B9%88%20sshd%20%E6%AF%8F%E4%B8%AA%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%9C%89%202%20%E4%B8%AA%E8%BF%9B%E7%A8%8B%EF%BC%9F.png)
我正在设置 VPS 服务器,并且习惯于pstree -p
在其上运行。我刚刚注意到 sshd 最初似乎只有 1 个服务器进程,然后为该系统上的每个客户端连接添加 2 个(它是一个运行 runit-init 的 debian buster,sshd 脚本由我编写)。为每个连接添加 1 个实例对我来说很有意义,但为什么要添加 2 个呢?
结果pstree -p
表明:
runit(1)-+-runsvdir(1303)-+-runsv(1341)-+-busybox(1366)
| | `-svlogd(1365)
| |-runsv(1342)-+-sshd(1361)-+-sshd(16288)---sshd(16294)---bash(16295)
| | | `-sshd(16305)---sshd(16311)---bash(16312)---pstree(16319)
| | `-svlogd(1360)
| |-runsv(1343)---getty(1354)
| |-runsv(1344)---getty(1353)
| |-runsv(1345)---getty(1352)
| |-runsv(1346)---getty(1351)
| |-runsv(1347)---getty(1349)
| |-runsv(1348)---getty(1350)
| `-runsv(13966)---runsvdir(14047)---runsv(14048)-+-darkhttpd(15417)
| `-svlogd(15291)
`-systemd-udevd(442)
这是我的 sshd 运行脚本:
. /etc/runit/common
test -e /run/sshd || mkdir /run/sshd
exec /usr/sbin/sshd -D -e
内容/etc/runit/common
(仅仅为了完整性,它很空,但我打算稍后添加一些内容):
exec 2>&1
set -xe
我没有异常行为(并且我也知道事情是可以完善的),我只是对事情的原因感到好奇。
答案1
这个问题是跨站点重复的为什么sshd
(OpenSSH) 每个连接创建两个进程?这回答:
权限分离——一个进程保留 root 权限来执行只有 root 才能执行的操作,另一个进程执行其他所有操作。
[…]
确认运行pstree -u
。
(-u
:显示 uid 转换;每当进程的 uid 与其父进程的 uid 不同时,新的 uid 就会显示在进程名称后的括号中)。