DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

SSH 后加 -A 仍没有 agent 转发:连接复用了旧 ControlMaster

启用连接共享后,后续ssh -A仍可能沿用旧master的agent。用-S none建立隔离连接验证,避免终止其他共享会话。

第一次连接服务器时没有启用 agent 转发,随后执行 ssh -A app-host,远端却仍不能使用本机 agent。如果配置启用了 ControlMaster auto 和 ControlPersist,第二次会话可能复用了第一次建立的连接,而不是重新建立带 agent 转发的连接。

这适用于启用了连接共享的 OpenSSH 客户端。先确认本机有可用 agent、目标是可信且允许转发的主机;没有 agent、服务端禁止转发或远端程序丢失环境变量,也会导致相似现象,不能只凭 -A 没效果就认定是连接复用。

共享的是连接,也包括 master 的 agent

常见共享配置如下,app-host 是已有主机别名:

Host app-host
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%C
    ControlPersist 600

这个片段只用于识别配置,不要直接覆盖已有 SSH 设置。控制 socket 所在目录应由本人控制,不能让其他用户写入。

通过同一个控制 socket 建立的后续会话,会使用 master 的网络连接。共享连接上的 agent 转发也属于 master,不能把后续命令中的 -A 理解为把旧 master 切换到了当前终端的另一个 agent。

即使第一次交互会话已经退出,ControlPersist 仍可能让 master 在后台保留一段时间。因此,“刚才已退出 SSH”不等于“下一次一定新建连接”。

在本地检查这个别名是否有可用的控制连接:

ssh -O check app-host

它使用当前配置对应的控制路径。检查失败可能是没有 master,也可能是本次别名、账号或端口对应了不同 socket,应结合配置判断。检查成功也只证明 master 在运行,不能证明 agent 可用。

单独建立一次不共享的连接

保持旧会话不动,为需要转发的这次会话禁用连接共享:

ssh -A -S none app-host

-S none 明确禁用这次连接的共享,-A 请求 agent 转发。原有别名中的目标地址、用户、端口和身份配置继续生效;实际主机名应替换为你已配置的可信目标。不要在命令里复制私钥或把私钥上传到远端。

只写 -o ControlMaster=no 不足以表达同样的意思:在有可用 ControlPath 时,非 master 会话仍可尝试复用它。这里选择 -S none 是为了明确分离这次连接。

可以分别在本地终端和新远端会话中检查 agent 是否可访问:

ssh-add -l >/dev/null 2>&1
printf 'agent-check exit=%s\n' "$?"

这不输出指纹或密钥注释。OpenSSH 的 ssh-add 返回 0 表示命令成功,2 表示无法联系 agent;其他失败状态要结合本机手册和 agent 状态判断,不能一律当成连接复用问题。即使能列出身份,也不保证目标服务已授权其中的密钥。

如果隔离的新连接能访问 agent,而复用会话不能,且首次 master 未启用转发,就与这里的机制相符。新连接仍失败时,应检查本机 agent、服务端转发策略和远端环境,不要通过删除所有控制 socket 或关闭主机密钥校验来排错。

别为修一条会话中断其他任务

不需要先执行 ssh -O exit 或删除 socket 文件。结束 master 可能影响依赖它的现有会话和转发;删除文件也不是重新配置连接的稳妥办法。这里的隔离连接在正常退出后结束,其他共享会话继续由原 master 管理。

Agent 转发应限制到确有需要的可信主机。远端具备足够权限的进程可能通过转发的 agent 请求身份认证,虽然不能直接从 agent 取出私钥材料,也不意味着不存在凭据滥用风险。不要为省事给 Host * 全局开启 ForwardAgent yes。

如果只是借跳板机到达最终 SSH 主机,可以评估由本地客户端直接通过跳板建立连接的方式,避免让跳板使用转发的 agent;这与必须在远端运行需要认证的任务不同。改变脚本连接方式前应单独验证,不必在修复当前会话时一并重构。

验证应包括新连接确实可访问预期 agent,以及实际需要的远端操作获得正确授权。任务完成正常退出这次隔离会话;临时命令选项无需改回服务器配置。若还调整了客户端文件,恢复本次保存的配置即可,不要终止不相关的 master。