ControlMaster 是 OpenSSH 内置的连接复用机制,非免密登录本身,而是复用已认证主通道实现毫秒级连接;需在 ~/.ssh/config 中配置 ControlMaster auto、ControlPath ~/.ssh/ctrl-%r@%h:%p(目录需提前创建并 chmod 700)、ControlPersist 600,并手动预热主通道后方可生效。

ControlMaster 是 OpenSSH 内置的连接复用机制,不是免密登录本身,而是让后续连接“搭便车”复用已认证的主通道。它能将多次 SSH、scp、rsync 或 Ansible 连接的建立时间从秒级压到毫秒级,且不牺牲任何安全性——首次连接仍完整执行加密握手与认证,后续只是共享隧道。
核心配置三要素
必须写入 ~/.ssh/config 文件(不能靠命令行临时加参数):
-
ControlMaster auto:自动判断是否新建主连接。首次连接创建,之后同目标自动复用,无需手动加
-M或-S -
ControlPath ~/.ssh/ctrl-%r@%h:%p:套接字路径需唯一标识连接,
%r(用户名)、%h(主机名)、%p(端口)缺一不可;目录~/.ssh/ctrl需提前创建并设权限为700 -
ControlPersist 600:主连接空闲 10 分钟后自动退出,兼顾效率与资源回收;调试可用
5m,生产环境建议不超过300(5 分钟)
配置生效前的关键操作
写完配置不会自动启动主通道,必须主动“预热”一次:
- 执行任意完整登录命令,例如:
ssh user@host -p 2222 "exit" - 检查套接字是否生成:
ls -l ~/.ssh/ctrl-user@host:2222 - 确认主进程运行中:
ssh -O check user@host -p 2222,返回Master running (pid: XXX)即成功 - 若失败或残留旧连接,先清理:
ssh -O exit user@host -p 2222,再重试
哪些场景能自动受益
只要目标匹配 ControlPath 规则,以下全部复用主通道:
- 连续执行多条
ssh user@host "cmd" - 混用
scp、rsync -e "ssh"向同一主机传文件 - Ansible 批量执行(前提是
ansible.cfg未覆盖ssh_args) - 多个终端、tmux 窗口、VS Code 远程终端同时连同一台服务器
常见失效原因与自查点
复用失败通常源于细节疏漏,而非功能异常:
- 套接字目录不存在或权限不对:运行
mkdir -p ~/.ssh/ctrl && chmod 700 ~/.ssh/ctrl - ControlPath 缺少
%r或%h,导致不同用户/主机共用一个 socket 文件 - 服务端限制了最大连接数,需检查
/etc/ssh/sshd_config中的MaxSessions和MaxStartups - 误用
ControlPersist yes:会导致主进程无限驻留,易积累僵尸套接字,应改用具体秒数或带单位值(如10m)

















