用 SSH ControlMaster 复用连接,加速频繁 SSH/SCP/rsync

举报
yd_229231784 发表于 2026/11/08 15:17:02 2026/11/08
【摘要】 同一主机频繁执行 SSH、SCP、rsync 时,重复握手与认证会拖慢脚本。本文用 ControlMaster 与 ControlPersist 复用连接,给出 ssh config 占位符配置,并用 ssh -O check 与 time 验证复用状态及首次、后续连接差异。

问题场景

在部署脚本、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 路径、权限和主连接生命周期。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。