修复 Windows 下 Git bash 调用 SSH 出现 publickey 验证错误, 和后续的幺蛾子

其实首个问题大部分内容可以在这个 StackOverflow 看完, 这里只是梳理一遍帮助自己记忆.

问题

在 VS Code 里对配置了 SSH 地址的仓库进行 git pull 时报错.

Permission denied (publickey)

原因

Git bash, 以及 VS Code 里调用 Git bash 的时候, 调用了 Git bash 自带的 SSH 客户端, 而没有走 Windows 自带的 OpenSSH.

所以就算已经自己手动启用了 Windows OpenSSH agent, 并添加了私钥, 如果 Git 仓库的远程地址使用了 SSH 协议, 进行操作的时候也会报”没有 publickey”之类的错误.

解决

自然就是手动指定, 让 Git bash 去调用 OpenSSH.

(开启 OpenSSH agent 服务和导入私钥过程略)

git config --global core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"


好的本来教程到这里就结束了, 但当我以为搞定了敲下 git pull 时, 又出现了新的整活.

variant ‘simple’ 问题

ssh variant 'simple' does not support setting port

这个很简单, StackOverflow 也有. 是自定义端口的问题, 解决也很简单.

git config --global ssh.variant ssh

这就完了? 还没.

路径没转义问题

刚才上面设置 core.sshCommand 的参数有点问题, 会导致 Git 去调用的时候读不到正确路径. 这里要转义.

git config --global core.sshCommand "C:\\Windows\\System32\\OpenSSH\\ssh.exe"

终于可…….还是没完.

上游 ssh-agent 问题

这次报的是

warning: agent returned different signature type ssh-rsa (expected rsa-sha2-512)

找到了 Github 的 Windows OpenSSH 讨论, 看到最高票答案说要手动更新 ssh-agent.

彳亍口巴.

更新的步骤抄答案就好, 提一句, 觉得微软文档 TL;DR 的, 临时执行脚本权限可以用这句.

Set-ExecutionPolicy Bypass -Scope Process

脚本装完会重置 SSH agent 服务状态, 手动重开一下.


很麻烦? 是的. 但只是兵来将挡水来土掩, 而且只需配置一次. 折腾完可以继续享受 SSH agent 免密码, 私钥的高安全性和通用性. 同时, 懂了更多它们的运行机制.