最直接有效的方法是用sshd -t命令验证配置语法,它不启动服务只做静态检查,能准确定位错误行和原因;无备份时可用sshd -t查看默认生效值辅助修复。

最直接有效的方法是用 sshd -t 命令验证配置语法,它不启动服务,只做静态检查,能准确定位错误行和原因。
用 sshd -t 快速定位问题
在修改 /etc/ssh/sshd_config 后,不要急着重启服务。先执行:
sudo sshd -t
它会输出类似这样的信息:
line 25: Bad configuration option: permitrootlogin
说明第 25 行拼错了关键字(正确应为 PermitRootLogin);或者:
line 18: Missing argument.
表示某条指令后面漏了值,比如写成了 Port 而没跟端口号。
这个命令是唯一能即时反馈语法问题的工具,且无需 root 权限也能运行(但需读取配置文件权限)。
没有备份时如何恢复默认行为
如果配置已损坏又没备份,sshd -T 可以打印当前生效的全部默认配置(忽略注释和空行),便于比对修复:
sudo sshd -T | grep -E '^(port|permitrootlogin|passwordauthentication)'
输出示例:
port 22
permitrootlogin yes
passwordauthentication yes
对照这些值,手动修正你改错的那几行即可。注意:它显示的是最终合并结果,不是原始文件内容。
编辑时要避开的几个坑
- 别用 vi 的 :%s/xxx/yyy/g 全局替换——容易误改注释行或路径中的相似字符串
- 别删整段配置(如 HostKey 相关行),缺失关键项会导致服务静默失败,sshd -t 还可能不报错
- 关键字区分大小写,PasswordAuthentication 写成 passwordauthentication 就算错
- 行首不能有多余空格,否则会被当成续行或注释处理
改完后必须验证再重启
语法通过只是第一步。执行 sudo sshd -t 显示 Config test succeeded 后,再运行:
sudo systemctl restart sshd
重启后立即用 sudo ss -tlnp | grep :22 确认端口是否真在监听,避免配置逻辑正确但服务因其他原因(如端口被占、SELinux 标签缺失)起不来。











