SSH 持久化连接
在使用 SSH 连接远程服务器时,经常会遇到连接一段时间后自动断开的问题。这是因为 SSH 客户端和服务端都有一个超时机制,当连接空闲超过一定时间后,会自动断开连接。
本文将介绍如何通过配置实现 SSH 连接的持久化,确保连接稳定不中断。
为什么要持久化
- 日常开发:频繁连接远程服务器时,不需要反复输入密码
- 长时间任务:在远程执行耗时任务(如编译、数据迁移)时不会中途断开
- 端口转发:使用 SSH 隧道进行端口转发时,持久化连接能保证转发稳定
- 自动化脚本:依赖 SSH 的自动化部署脚本不会因为连接中断而失败
配置方式
方式一:客户端配置(推荐)
在客户端配置 ServerAliveInterval,让客户端定期向服务端发送保活心跳。
# 编辑 SSH 客户端配置文件
vim ~/.ssh/config
添加以下内容:
Host *
ServerAliveInterval 60
ServerAliveCountMax 5
参数说明:
- ServerAliveInterval:客户端每隔 60 秒发送一次保活消息
- ServerAliveCountMax:连续 5 次未收到响应后才断开连接(即 5 分钟无响应才断开)
如果只想对特定主机生效:
Host my-server
HostName 192.168.1.100
User root
ServerAliveInterval 60
方式二:服务端配置
在服务端配置 ClientAliveInterval,让服务端检测客户端是否存活。
# 编辑 SSH 服务端配置文件
vim /etc/ssh/sshd_config
修改或添加:
ClientAliveInterval 60
ClientAliveCountMax 5
配置完成后重启 SSH 服务:
sudo systemctl restart sshd
两种方式对比
| 配置项 | 配置位置 | 优点 | 缺点 |
|---|---|---|---|
| ServerAliveInterval | 客户端 | 无需服务端权限,每个用户可自行配置 | 每个客户端都需要分别配置 |
| ClientAliveInterval | 服务端 | 一次配置对所有客户端生效 | 需要服务端 root 权限 |
进阶技巧
SSH 连接复用
利用 SSH 的 ControlMaster 功能,复用同一个连接,避免重复认证:
Host *
ControlMaster auto
ControlPath ~/.ssh/controlmasters/%r@%h:%p
ControlPersist 10m
这样在建立过一次连接后,10 分钟内再次连接会复用已有连接,无需重新输入密码。
排查连接断开的问题
如果配置后仍然断开,可以检查以下方面:
- 防火墙/NAT:网络中间的防火墙可能强制断开空闲连接
- 网络稳定性:使用
ping -i 10 server_ip测试网络稳定性 - SSH 日志:使用
ssh -vvv user@host查看详细连接日志
总结
通过配置 ServerAliveInterval 或 ClientAliveInterval,可以轻松实现 SSH 连接的持久化。推荐优先使用客户端配置方式,灵活性更高。对于更高级的需求,可以结合 ControlMaster 实现连接复用,进一步提升 SSH 使用体验。
Comments | 0条评论