ControlPersist 必须在 SSH 配置文件中与 ControlMaster、ControlPath 联用才生效;正确配置需设 ControlMaster auto、ControlPath 带唯一标识路径、ControlPersist 600,并确保目录权限正确、无路径冲突。

直接用 ssh -O ControlPersist=600 是无效的写法——ControlPersist 是配置项,不能通过 -O 临时传入。它必须写在 SSH 客户端配置文件中,配合 ControlMaster 和 ControlPath 才能真正生效。
正确启用 ControlPersist 的三要素
要让后台主连接在最后一个会话关闭后仍驻留 10 分钟(600 秒),需同时满足以下三点:
-
启用复用机制:设置
ControlMaster auto,表示首次连接时自动创建主通道,后续连接自动复用 -
指定唯一套接字路径:用
ControlPath ~/.ssh/sockets/%r@%h:%p,其中%r(用户)、%h(主机)、%p(端口)确保不同连接不冲突;提前执行mkdir -p ~/.ssh/sockets -
声明后台保活时长:
ControlPersist 600表示主连接空闲后继续存活 600 秒,期间新 ssh 命令可零延迟接入
配置示例(~/.ssh/config)
在用户级配置中为特定主机或通配所有目标添加如下段落:
Host prod-server
HostName 192.168.10.50
User admin
ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h:%p
ControlPersist 600
保存后,首次运行 ssh prod-server 会建立主连接并保持后台运行;之后无论新开终端、重连、或脚本调用 ssh prod-server uptime,都跳过 TCP 握手、密钥交换和认证流程,耗时从秒级降至毫秒级。
避免常见失效陷阱
-
权限问题:
ControlPath所在目录(如~/.ssh/sockets)必须属用户所有且权限 ≤700,否则 SSH 拒绝创建套接字 -
路径冲突:不要用
%h单独作路径名(如~/.ssh/%h),多用户同连一台服务器时会覆盖,引发“Bad control socket”错误 -
未实际触发复用:若每次连接都加
-o ControlMaster=no或显式指定不同-S路径,则绕过复用机制,ControlPersist形同虚设
验证与手动管理
检查主连接是否活跃:
- 运行
ssh -O check prod-server→ 显示 “Master running” 即生效 - 查看套接字文件:
ls -l ~/.ssh/sockets/应存在对应 socket 文件 - 主动终止后台主连接:
ssh -O exit prod-server
这种机制对 Ansible、Fabric 或自研批量执行脚本尤其友好——10 台服务器循环执行命令时,仅首台建连,其余全部复用,整体耗时压缩 70% 以上。











