Linux配置SSH开机自启的关键是通过systemd启用对应服务单元:Debian/Ubuntu用sudo systemctl enable --now ssh,RHEL/CentOS用sudo systemctl enable --now sshd;启用后须验证systemctl status显示active (running)且ss -tlnp | grep ':22'确认端口监听。

Linux中配置SSH服务开机自启,关键不是“加个启动脚本”,而是让systemd在系统启动时自动拉起ssh(或sshd)服务。不同发行版服务名和命令略有差异,但逻辑一致:安装 → 启动 → 启用 → 验证。
确认服务名并启用开机自启
Debian/Ubuntu/Kali 系统使用 ssh 作为服务单元名;RHEL/CentOS/Rocky/Fedora 则用 sshd。必须用对名称,否则enable无效:
- Debian系(含Kali 2024.4):sudo systemctl enable --now ssh
- RHEL系:sudo systemctl enable --now sshd
--now 参数表示“同时执行 start + enable”,避免分两步遗漏启动。单独运行 enable 不会立即启动服务,仅写入开机启动项。
验证是否真正生效
启用后不能只看“enabled”状态,要确认服务已运行且监听端口:
- 检查服务状态:
sudo systemctl status ssh(或sshd),输出中需含 active (running) - 确认22端口正在监听:
sudo ss -tlnp | grep ':22',看到 LISTEN 才算成功 - 模拟重启验证(可选):
sudo systemctl reboot,重启后立刻执行上述两条命令复查
注意常见失效原因
即使执行了enable,SSH仍可能开机不启动,多因依赖项缺失或配置错误:
- 服务未安装或密钥未生成:Kali 2024.4 默认不带
openssh-server,也无主机密钥,systemctl start会静默失败。先运行sudo apt install openssh-server和sudo ssh-keygen -A - 防火墙拦截:开机自启≠网络可达。ufw/firewalld 必须放行22端口(如
sudo ufw allow 22),否则远程连接仍超时 - 配置语法错误:修改过
/etc/ssh/sshd_config后未重启服务,或存在拼写错误(如PermitRootLogin写成PermitRootLoginn),会导致服务启动失败
不要用旧方法替代systemd
避免使用service ssh start、/etc/init.d/ssh start 或把命令写进/etc/rc.local。这些方式在现代systemd系统中:
- 不保证服务依赖顺序(如网络未就绪时就尝试监听)
- 无法被
systemctl list-unit-files识别,状态不可控 - 重启后大概率失效,属于兼容层,非持久化方案


















