vscode不管理ssh agent,仅继承终端已启动的agent环境;需从该终端执行code .启动,并在~/.ssh/config对应host块显式设forwardagent yes,同时确保远程sshd_config中allowagentforwarding yes且重载服务。

VSCode 本身不启动、不管理、也不“配置” SSH Agent,它只被动继承你终端里已就绪的 ssh-agent 环境。所谓“私钥转发授权”,本质是让远程服务器能通过加密通道临时调用你本地已加载的密钥——这整套链路必须从终端环境开始对齐,否则 Remote-SSH 插件再怎么点连接都会卡在 Permission denied (publickey) 或反复弹密码框。
为什么 Remote-SSH 连得上但 git clone 私有仓库失败
这是最典型的“转发假成功”现象:VSCode 能登录远程主机,echo $SSH_AUTH_SOCK 也有输出,但执行 git clone git@github.com:private/repo.git 仍报错。根本原因不是转发没开,而是:
-
ForwardAgent yes没写在~/.ssh/config中对应 Host 的具体区块里(比如只写了Host *,Remote-SSH 不认通配) - 远程服务器的
/etc/ssh/sshd_config中AllowAgentForwarding被注释或设为no,且未重载服务(sudo systemctl reload ssh) - 你在远程终端里执行的是
ssh-add -l,但它查的是远程的 agent —— 正确验证方式是回本地终端运行ssh-add -l,确认密钥真正在本地 agent 里
Windows 用户必须统一用 Windows OpenSSH agent
Git for Windows 自带的 ssh-agent 和系统级 Windows OpenSSH(路径:C:\Windows\System32\OpenSSH\ssh-agent.exe)完全不兼容。常见症状是:
- Git Bash 里
ssh-add -l能看到密钥,但 VSCode 从 Windows Terminal 启动后却提示Agent admitted failure to sign using the key - PowerShell 里
Get-Service ssh-agent显示已启动,但$env:SSH_AUTH_SOCK为空
解决方法只有两个硬要求:
- 确保 Windows OpenSSH agent 已设为自动启动:
Set-Service -StartupType Automatic -Name ssh-agent,然后Start-Service ssh-agent - 所有密钥都用
ssh-add ~/.ssh/id_rsa加到这个 agent,别碰 Git Bash 的 - VSCode 必须从 Windows Terminal(或 PowerShell)中执行
code .启动,不能点图标
macOS 上 launchd 导致 GUI 应用拿不到 SSH_AUTH_SOCK
如果你在 ~/.zshrc 里写了 eval $(ssh-agent -s),那终端里一切正常,但 VSCode 图形界面进程启动时根本读不到这个变量。launchd 管理的 GUI 应用默认不继承 shell 的环境变量。
必须补这一句才能让 VSCode 拿到:
launchctl setenv SSH_AUTH_SOCK "$SSH_AUTH_SOCK"
注意:这不是一次性的,要加到你的 shell 初始化文件末尾(如 ~/.zshrc),否则每次重启终端后变量又丢了。更稳妥的做法是改用 launchd 托管 agent(例如用 ssh-agent-launchd 工具),但对多数人来说,上面那行 launchctl setenv 就够用。
转发生效但远程 git 仍走密码,检查是否用了 HTTPS 协议
很多人以为转发失败,其实是自己在远程执行的是 git clone https://github.com/private/repo.git —— 这根本不会触发 SSH agent,它走的是 HTTPS + token 或密码认证。
务必确认远程仓库 URL 是 SSH 格式:
- 错的:
https://github.com/private/repo.git - 对的:
git@github.com:private/repo.git(或ssh://git@github.com/private/repo.git)
如果已有仓库,进目录执行:git remote set-url origin git@github.com:private/repo.git
顺手检查 git config --global url."git@github.com:".insteadOf "https://github.com/" 是否已设置,避免以后新建项目又踩坑。
真正容易被忽略的点只有一个:转发不是“开了就一劳永逸”,它依赖整个链路每个环节的环境变量、配置项和权限状态都对得上。哪怕 ForwardAgent yes 写对了,只要本地 agent 没运行、远程 sshd_config 关着、或者你用错了终端启动 VSCode,就会静默失效——而错误提示永远只是模糊的 “permission denied”。











