不轻信AI,警惕AI一本正经的胡说八道
今天遇到了一个sshd加载配置顺序的问题,惯性操作问了下AI,结果AI给我了一堆错误的结果,这是第二次了,上一次给它指出,它还承认,这次干脆不承认了。
问AI的问题如下:假设sshd有以下几个配置文件,/etc/ssh/sshd_config,/etc/ssh/sshd_config.d/40-init.conf,/etc/ssh/sshd_config.d/50-init.conf,这几个配置文件中都有一个相同的配置,sshd最终的配置由谁决定的
AI的回答:
一、sshd配置文件的加载规则(核心逻辑)
sshd读取配置的优先级和覆盖机制遵循以下原则,这是理解最终配置的关键:
1. 加载顺序:先主配置,后子目录文件(按文件名排序)
- 第一步:读取主配置文件
/etc/ssh/sshd_config。 - 第二步:读取
/etc/ssh/sshd_config.d/目录下的所有.conf后缀文件,按文件名的字母/数字顺序加载(系统会按字符串排序,比如40-init.conf先于50-init.conf)。
2. 覆盖规则:后加载的配置覆盖先加载的
sshd对重复的配置项,遵循“后加载的配置会覆盖先加载的”原则(除非配置项本身支持“累加”,但绝大多数sshd配置项是“单值生效”,比如Port、PermitRootLogin等)。
3. 特殊前提:主配置需开启子目录加载
主配置文件 /etc/ssh/sshd_config 中必须包含一行:
Include /etc/ssh/sshd_config.d/*.conf
这行是启用子目录配置的关键(主流Linux发行版如CentOS 8+/Ubuntu 20.04+默认已配置)。如果没有这行,sshd_config.d 下的文件不会被加载,仅主配置生效。
二、你的场景:最终配置由谁决定
你的文件列表:
- 主配置:
/etc/ssh/sshd_config(先加载) - 子目录:
40-init.conf(次加载)→50-init.conf(最后加载)
针对“相同配置项”的最终生效结果:
| 配置项位置 | 加载顺序 | 最终是否生效 |
|---|---|---|
/etc/ssh/sshd_config |
1(最先) | 被后续覆盖 |
/etc/ssh/sshd_config.d/40-init.conf |
2 | 被50-init.conf覆盖 |
/etc/ssh/sshd_config.d/50-init.conf |
3(最后) | 最终生效 |
三、验证方法(实操确认)
你可以通过以下命令直接查看sshd加载后的最终生效配置,无需重启服务:
# 查看sshd解析后的完整配置(包含所有文件的最终合并结果)
sshd -T
# 筛选特定配置项(比如查看PermitRootLogin的最终值)
sshd -T | grep -i permitrootlogin
-T参数的作用:让sshd打印出加载所有配置文件后最终生效的配置集,这是最权威的验证方式。
四、例外情况:支持“累加”的配置项
极少数配置项支持多个值累加(而非覆盖),比如 AllowGroups、AllowUsers,这类配置项的规则是:
- 所有文件中的该配置项会合并为一个列表(而非覆盖)。
- 若出现冲突(比如同时配置
AllowUsers和DenyUsers),按sshd的权限逻辑处理(deny优先于allow)。
总结
- 核心规则:sshd配置遵循“先主配置,后子目录文件(按文件名排序),后加载的覆盖先加载的”。
- 你的场景:
50-init.conf是最后加载的,因此相同配置项由它决定最终值。 - 验证方式:用
sshd -T可直接查看最终生效的所有配置,是最直接的确认方法。
我自己验证的加载逻辑
加载顺序:
- sshd_config
- sshd_config.d/50-ini.conf
- sshd_config.d/40-ini.conf
其中50和40是两个配置文件
结论:
相同的配置,最终生效的是标号最小的子配置文件。而AI的回答是最大标号的配置文件。
这个问题很简单,验证几次就能出来,最讨厌的是AI的一顿胡说八道,假的里面掺着真的,不验证的话真的分不清它到底哪句话是真哪句话是假。

浙公网安备 33010602011771号