在管理 CentOS 服务器时,SSH(Secure Shell)服务是进行远程管理的核心,有时我们可能会遇到 sshd 服务启动失败的情况,这会立刻阻断我们的远程访问路径,是一个需要紧急处理的严重问题,本文将系统性地介绍 sshd 启动报错的排查思路与常见解决方案。

初步排查与日志定位
当 sshd 服务无法启动时,首要任务不是盲目修改配置,而是通过系统工具定位问题的根源,CentOS 7 及以后版本广泛使用 systemd,因此我们可以利用 systemctl 和 journalctl 命令进行高效诊断。
查看服务的当前状态,这通常会给出一个简洁的错误提示:
systemctl status sshd
该命令的输出会包含服务是否处于 failed(失败)状态、最近的几行日志以及可能导致错误的关键代码(如 exit code),如果信息不足,下一步是查看详细的系统日志,专门针对 sshd 服务:
journalctl -u sshd
或者,使用 -xe 参数查看系统所有单元的详细错误日志:
journalctl -xe
日志中的错误信息是解决问题的关键,你可能会看到 "Port 22 already in use"(端口被占用)、"Could not load host key"(无法加载主机密钥)或 "Bad configuration option"(错误的配置选项)等具体描述。
常见错误场景与解决方案
根据日志提示,我们可以针对性地解决以下几类常见问题。
配置文件语法错误
手动编辑 /etc/ssh/sshd_config 文件是导致 sshd 启动失败的最常见原因之一,一个拼写错误、多余的空格或不支持的参数都可能导致服务无法解析配置文件。

在修改配置后、重启服务前,务必使用 sshd 提供的测试模式来验证语法:
sshd -t
如果配置文件存在语法错误,此命令会直接打印出错误信息及其所在行号。/etc/ssh/sshd_config: line 15: Bad configuration option: PermitRoo,根据提示修正对应行即可,如果命令执行后没有任何输出,则表示配置文件语法正确。
端口被占用
默认情况下,sshd 监听 22 端口,如果该端口已被其他进程(如另一个 SSH 实例、或其他网络服务)占用,sshd 将无法绑定该端口从而导致启动失败。
可以使用 ss 或 netstat 命令来检查端口占用情况:
ss -tlnp | grep :22
如果发现有其他进程在使用 22 端口,你需要做出选择:要么停止占用该端口的服务,要么修改 sshd_config 文件中的 Port 指令,将其更改为一个未被占用的端口号(如 2222),然后重启 sshd 服务。
主机密钥问题
SSH 服务依赖于主机密钥(Host Keys)来加密通信并验证服务器身份,如果密钥文件丢失、损坏或权限不正确,sshd 服务将拒绝启动。
主机密钥通常存放在 /etc/ssh/ 目录下,文件名如 ssh_host_*_key。

检查这些文件是否存在以及权限是否正确,私钥文件应仅 root 用户可读写(权限为 600),公钥文件可为所有用户读取(权限为 644)。
ls -l /etc/ssh/ssh_host_*_key
如果密钥文件确实丢失或损坏,可以使用以下命令重新生成所有类型的主机密钥:
ssh-keygen -A
此命令会自动为缺失的密钥类型生成新的密钥对,并设置正确的权限,之后再次尝试启动 sshd 服务即可。
排查思路小编总结表
为了更清晰地展示排查流程,下表小编总结了常见问题、诊断命令和解决方案:
| 可能原因 | 诊断命令 | 解决方案 |
|---|---|---|
| 配置文件语法错误 | systemctl status sshd, journalctl -u sshd |
使用 sshd -t 检查并修正 /etc/ssh/sshd_config 文件 |
| 端口被占用 | ss -tlnp \| grep :22 |
停止占用端口的进程,或在 sshd_config 中更改 Port |
| 主机密钥丢失/权限错误 | ls -l /etc/ssh/ssh_host_*_key |
使用 ssh-keygen -A 重新生成密钥,并用 chmod 修正权限 |
相关问答 FAQs
问题1:修改了 sshd_config 文件后,必须重启服务器才能生效吗?
解答: 不需要,修改 sshd_config 文件后,只需重启 sshd 服务即可让配置生效,可以使用命令 systemctl restart sshd,这个命令会先停止服务再启动,确保所有配置都被重新加载,如果只是修改了少数不影响核心连接的配置(如 ClientAliveInterval),使用 systemctl reload sshd 会更平滑,它会让 sshd 主进程重新读取配置文件,而不会中断现有的 SSH 连接,但为了确保最大的兼容性,尤其是在进行重大更改时,推荐使用 restart。
问题2:sshd -t 和 systemctl status sshd 的输出信息有什么不同?
解答: 两者的目的和侧重点不同。sshd -t 是一个纯粹的配置文件语法检查工具,它只负责解析 /etc/ssh/sshd_config 文件,检查其语法是否正确、参数是否合法,它不关心端口是否被占用、密钥文件是否存在等运行时问题,而 systemctl status sshd 报告的是由 systemd 管理的 sshd 服务的整体运行状态,它的信息更全面,不仅会提示配置语法错误(如果这是导致失败的原因),还会报告服务启动失败的其他原因,例如权限问题、端口冲突、进程异常退出等。sshd -t 用于“事前预防”,而 systemctl status sshd 用于“事后诊断”。