不轻信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配置项是“单值生效”,比如PortPermitRootLogin等)。

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打印出加载所有配置文件后最终生效的配置集,这是最权威的验证方式。

四、例外情况:支持“累加”的配置项

极少数配置项支持多个值累加(而非覆盖),比如 AllowGroupsAllowUsers,这类配置项的规则是:

  • 所有文件中的该配置项会合并为一个列表(而非覆盖)。
  • 若出现冲突(比如同时配置AllowUsersDenyUsers),按sshd的权限逻辑处理(deny优先于allow)。

总结

  1. 核心规则:sshd配置遵循“先主配置,后子目录文件(按文件名排序),后加载的覆盖先加载的”。
  2. 你的场景:50-init.conf 是最后加载的,因此相同配置项由它决定最终值。
  3. 验证方式:用 sshd -T 可直接查看最终生效的所有配置,是最直接的确认方法。

我自己验证的加载逻辑

加载顺序:

  1. sshd_config
  2. sshd_config.d/50-ini.conf
  3. sshd_config.d/40-ini.conf

其中50和40是两个配置文件

结论:

相同的配置,最终生效的是标号最小的子配置文件。而AI的回答是最大标号的配置文件。

这个问题很简单,验证几次就能出来,最讨厌的是AI的一顿胡说八道,假的里面掺着真的,不验证的话真的分不清它到底哪句话是真哪句话是假。

posted @ 2025-12-26 14:50  薄醉愁听花  阅读(0)  评论(0)    收藏  举报