两个参数的分工
sshd -t 做的是配置语法与密钥检查:它把配置文件解析一遍,遇到拼错的指令、缺少的算法实现、损坏的主机密钥就报错退出,是 reload 前的强制动作。sshd -T 则把默认值、主配置与包含目录合并后,输出最终生效的完整配置,用来回答『改了到底生效没有』。带上 -C 指定用户、来源地址等上下文,还能看到 Match 块在该条件下的实际匹配结果。
基本信息
| 语法校验 | sshd -t |
|---|---|
| 查看生效值 | sshd -T(输出为 key value 两列) |
| 按上下文查看 | sshd -T -C user=、host=、addr=、laddr=、lport= |
| 过滤查看 | sshd -T 配合 grep,如 permitrootlogin、passwordauthentication |
| 重载方式 | systemctl reload sshd(保留现有连接) |
| 权限要求 | root;非 root 执行可能因读取主机密钥失败而报错 |
典型使用场景
- 每次修改 SSH 配置后先校验再重载,避免服务起不来
- 确认 PermitRootLogin 等关键项到底是主配置还是 drop-in 在起作用
- 验证 Match 块对特定用户与来源是否按预期生效
- 批量核查多台机器的 SSH 配置是否与基线一致
- 重载后服务异常时快速定位是哪一行配置引发的
校验命令
校验命令
sshd -t # 语法与密钥检查,无输出即通过
sshd -T | grep -E 'permitrootlogin|passwordauthentication|port|maxauthtries'
sshd -T -C user=ops,host=10.0.0.9,addr=10.0.0.9 # 按上下文查看 Match 匹配后的结果
sshd -T | grep -i -E 'clientalive|allowusers|ciphers' # 抽查加固项是否生效
systemctl reload sshd # reload 只重读配置并保留现有会话改配置的安全流程
改配置的安全流程
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date +%F) # 先备份
# 用编辑器修改需要的项
sshd -t || echo '语法错误,先恢复备份再排查' # 校验失败不要 reload
sshd -T | grep -i permitrootlogin # 确认最终生效值
systemctl reload sshd # 生效
ssh -o PreferredAuthentications=publickey user@localhost true # 另开会话实测,不要断开当前会话输出读法与判读
| 命令与输出 | 含义 | 判读要点 |
|---|---|---|
| sshd -t 无输出 | 语法与密钥检查通过 | 可以安全 reload |
| sshd -t 报行号与错误 | 该行语法或取值非法 | 按行号修正后再校验 |
| sshd -T 两列输出 | 最终生效的配置项与值 | 包含默认值与包含文件的合并结果 |
| -T 与主配置不一致 | 被 drop-in 或默认值覆盖 | 到 conf.d 或 Include 目录里找来源 |
| -C 指定上下文后结果不同 | Match 块对该会话生效 | 按业务需求核对分支逻辑 |
| reload 报错 | 配置或权限问题 | reload 不影响已建立连接,可退回备份 |
sshd -t 只覆盖语法层面,语义是否正确(比如 Match 是否真的匹配到目标用户)要结合 sshd -T -C 的输出来看。
远程改配置优先 reload 而不是 restart:reload 保留现有连接,即使新配置有问题也还能用当前会话回退,restart 会断开所有登录。