用 SSH ControlMaster 复用连接,加速频繁 SSH/SCP/rsync
问题场景
在部署脚本、CI 任务或日常运维中,经常需要对同一台主机连续执行多条 SSH 命令,或者反复用 SCP/rsync 同步小文件。每次调用如果都重新建立 TCP 连接、协商加密算法并完成用户认证,就会产生重复开销;命令本身很短时,这部分开销占比更明显。
OpenSSH 提供了连接复用机制:第一个连接作为主连接(ControlMaster),后续连接复用同一个已认证的通道,通过本地 Unix domain socket 通信。ControlPersist 则让主连接在最后一个会话结束后继续在后台保持一段时间,方便紧接着的调用直接复用。
配置占位符与最小示例
下面以主机别名 demo-host 为例,目标地址、用户名均为占位值,请替换为实际环境。先创建存放 socket 的目录:
mkdir -p ~/.ssh/cm
chmod 700 ~/.ssh/cm
在 ~/.ssh/config 中追加(不要覆盖已有内容):
Host demo-host
HostName 203.0.113.10
User demo
Port 22
IdentityFile ~/.ssh/id_ed25519
ControlMaster auto
ControlPath ~/.ssh/cm/%r@%h:%p
ControlPersist 10m
ServerAliveInterval 30
ServerAliveCountMax 3
ControlPath 中的占位符含义:%r 是远端用户名,%h 是目标主机名,%p 是端口。这样不同用户、主机、端口会使用不同 socket,减少冲突。如果路径偏长,可改用 %C(基于连接参数的哈希)缩短文件名,例如 ControlPath ~/.ssh/cm/%C;具体可用占位符以本机 man ssh_config 为准。
ControlMaster auto 表示首次连接时自动创建主连接;ControlPersist 10m 表示最后一个会话结束后主连接继续保持 10 分钟。配置完成后建议检查权限:
chmod 600 ~/.ssh/config
运行与验证
前提:demo-host 已能通过密钥正常登录,且本机 OpenSSH 客户端支持连接复用。先建立首次连接:
ssh demo-host 'echo first-connect'
然后检查主连接状态:
ssh -O check demo-host
如果复用生效,输出会包含 Master running (pid=<pid>) 之类的信息(<pid> 为实际进程号占位)。若提示没有主连接,可用 ssh -v demo-host 'true' 查看协商过程,并确认 ControlPath 目录存在、权限正确。
用 time 对比首次与后续调用。先显式关闭已有主连接,确保第一次是冷启动:
ssh -O exit demo-host >/dev/null 2>&1 || true
time ssh demo-host 'true'
time ssh demo-host 'true'
time 会输出 real、user、sys 三行。第一次通常包含建立连接和认证过程;第二次在同一 ControlPath 上复用主连接,real 行可用于观察差异。不要只看一次结果,建议在目标主机可达、网络稳定的前提下多执行几轮,并记录命令输出,避免把网络抖动误判为复用效果。
SCP 与 rsync 同样会读取 ~/.ssh/config 中的该主机配置。准备一个临时文件:
printf 'probe\n' > probe.txt
time scp probe.txt demo-host:/tmp/
time rsync -a probe.txt demo-host:/tmp/
rsync 需要本地与远端都安装;若环境没有 rsync,可只验证 SCP。传输完成后清理:
rm -f probe.txt
ssh demo-host 'rm -f /tmp/probe.txt'
边界与限制
- 连接复用减少的是握手和认证开销,不会提升链路带宽,也不会加速大文件的实质传输。对大量小命令、短连接脚本更有意义。
ControlPath依赖本地 Unix domain socket。部分系统对 socket 路径长度有限制,建议使用较短目录,或用%C生成短文件名。socket 目录权限应为700,不要放在共享目录。- 主连接异常退出时,复用会话可能受影响;可用
ssh -O check demo-host诊断,用ssh -O exit demo-host关闭主连接后重试。不要直接删除正在使用的 socket 文件。 - 密码认证在首次建立主连接时仍可能需要交互;自动化脚本应使用密钥并考虑
BatchMode,避免等待输入。不同用户不应共享同一个 ControlPath。 - 与
ProxyJump、跳板机或多级配置组合时,占位符展开结果可能与预期不同。可用ssh -G demo-host | grep -i control查看生效配置,再决定ControlPath写法。 - 清理时先执行
ssh -O exit demo-host,再按需删除~/.ssh/cm下的残留 socket;回滚配置则删除~/.ssh/config中对应的Host demo-host段。
小结
对同一主机的频繁 SSH/SCP/rsync 调用,可以用 ControlMaster 建立主连接、用 ControlPersist 保持后台复用,并通过 ssh -O check 验证状态、用 time 对比首次与后续连接。配置的关键是让 ControlPath 稳定且可写,并注意 socket 路径、权限和主连接生命周期。
- 点赞
- 收藏
- 关注作者
评论(0)