VS Code / Bitbucket / SSH - 权限被拒绝(公钥)

cl1*_*10k 19 git ssh bitbucket windows-10 visual-studio-code

我正在尝试通过 ssh 从 vscode 访问 bitbucket,但总是获得权限被拒绝 (publickey)

SSH 密钥位于 下~\.ssh\,公钥在 中正确设置bitbucket/settings/security/sshkeys。按键经过测试,可以正常工作!

启动后,我可以从 Windows 命令提示符和 powershell 访问我的存储库而不会出现问题,但不能从 git bash 或 vscode 访问。在 git bash 中手动设置 ssh 并启动 vscode 工作:

eval $(ssh-agent)
ssh-add /c/Users/username/.ssh/privatekey
code
Run Code Online (Sandbox Code Playgroud)

我的环境:

  • Windows 10 企业版 (1803/17134.765)
  • Visual Studio 代码 (1.35.0)
  • 适用于 Windows 的 git (2.20.1.windows.1)
  • 通过 ssh 的 bitbucket
  • 我想我正在使用在后来的 Windows10 更新之一中引入的 ssh-agent(不知道如何检查,不过 Windows ssh-agent 服务正在运行)。
  • 我的用户文件夹(包含 /.ssh)和 repo 的工作副本位于网络驱动器上

对我来说,问题归结为一个问题:为什么 vscode 不使用 windows native,正确设置 ssh 服务,而是依赖 git bash ssh 代理?

免责声明:我花了几个小时阅读有关此主题的主题并摆弄设置。我怀疑问题与Windows10下网络驱动器的延迟部署有关(已知问题)。我的 Windows 组策略设置为在启动/登录时等待网络。

小智 56

Windows 10 允许使用所有默认的 OpenSSH 工具。但是,每次我尝试通过 SSH 从 Github、Gitlab 或 Bitbucket 克隆存储库时,git 都会抛出权限被拒绝。您需要执行一些调整才能使其正常工作。

  1. 确保 ssh-agent 服务已启用,或在 Powershell 中运行(以管理员身份):

Get-Service -Name ssh-agent | Set-Service -StartupType Manual

  1. ssh-agent
  2. ssh-add
  3. git config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe

  • 您需要以管理员身份运行 Windows Powershell(右键单击“以管理员身份运行”)。否则,您将收到“访问被拒绝”错误。 (4认同)
  • 做到了!万分感谢! (2认同)
  • @PasanJayawickrama也许你想要“Set-Service -StartupType Automatic”。 (2认同)

小智 12

如果有人在 mac 中寻找答案

ssh-agent

ssh-add,在此命令后添加您的密码


JBS*_*rro 7

我已经纠结了这么久了,终于明白了!

请注意,我使用的是 Windows 10。

有很多事情可能是错误的。其中一些已在其他答案中修复。而且随着时间的推移和各种 VSCode 版本(或 VS 或 GitHub Desktop 或其他使用 git 的程序),情况也有所不同。OpenSSL 的更新(自动)也曾经是罪魁祸首。总之,搞清楚到底是怎么回事真是一团乱。

我还有两点需要补充,您可以通过调试来弄清楚发生了什么:

  1. 相关PATH
  2. 相关SSH_AUTH_SOCK

小路

我们需要验证git.exe您的 IDE 是否与您在终端上对话的 IDE 相同。

每当您使用 Windows 版 Git Bash(从现在开始称为“Bash”)时,它都PATH与全局不同PATH,因为 Bash 会插入一些路径,在我的例子中

  • /mingw64/bin
  • /usr/bin
  • $HOME/bin (请注意,以 开头的路径/会自动在前面添加 git 安装文件夹,默认情况下为C:\Program Files\Git)。

这可能会导致 Bash 和 IDE 解析不同的git.exe,正如PATH所使用的那样(和ssh.exessh-add.exe)。当我启动 IDE(在我的例子中为 vscode)时,它使用 Windows 的 PATH 进行解析git.exe并找到(在我的设置中)C:\Program Files\Git\cmd\git.exe。这确实很不幸,因为在 Bash 终端中它发现/mingw64/bin/git.exe. 您可以在“输出”面板的 Git 日志的第一行找到 VSCode 的 git 版本。bash 只需运行which gitwhere git(后者将向您显示所有内容PATH)。

mingw64我通过相应的调整来标准化使用 git PATH

现在,如果您启用了ssh-agent密码,则在终端中输入密码,您可能期望从那时起您的 IDE 也可以解析该密码,因为它们使用相同的密码,git.exe因此也使用相同的ssh.exessh-add.exe

SSH_AUTH_SOCK

对于任何终端或 IDE 与之通信来说,唯一真正重要的ssh-agent是它知道这一点。这仅由环境变量赋予SSH_AUTH_SOCK(请参阅源代码)。如果您的 IDE 或终端不知道此环境变量,则它不会在ssh-agent.

了解该环境变量如何在不同程序之间进行通信非常重要。这就是为什么许多关于 SO 的答案会将其写入文件~/.ssh/agent.env并在每个 bash 终端上读取该文件。但这对 IDE 没有影响。如果将其与 Powershell 结合使用,这也不是一个很好的解决方案:

  • 它也不会写入该.env文件,因此 bash 不会知道 ssh-agent
    • 这就是为什么-StartupType Automatic对终端没有影响
    • 如果您看到多个 ssh 代理正在生成,这可能就是原因。
  • Powershell 也不从.env文件中读取,因此它不知道 bash 实例化的信息ssh-agent

您可以通过使用环境变量集启动 IDE 来确认这确实是问题所在,例如通过对比

  • code ./your-project(这给予许可被拒绝)与
  • export SSH_AUTH_SOCK=/tmp/ssh-...your/agent...; code ./your-projectssh-client(假设已启动并填充 ,即已在其他地方调用,则不会拒绝许可ssh-add)。

您可以通过运行找到代理的套接字ssh-agent,它会打印它(否则您还没有启动它或添加密码)。我只是得出结论,这ssh-agent是一个打印可执行 bash 的二进制文件,因此你可以这样做eval `ssh-agent`

现在的问题是如何让 VSCode 了解SSH_AUTH_SOCK. 上面列出了一些方法(例如this),这些方法有时对我有用,但并不总是/当前。我也不明白那是如何运作的。如果你这样做,请告诉我。

如果您从导出的终端启动 vscode SSH_AUTH_SOCK,那么它将可以访问ssh-agent,但是如果您从开始菜单或其他快捷方式启动 vscode,是的,那么它将不会有环境变量。您实际上无法在系统启动时将其设置为系统环境中的全局环境变量,因为该值分配得太晚:仅在运行 ssh-agent 时才分配。

所以目前我就是这么做的。我从 vscode 终端重新启动 vscode。这实在是不太令人满意。我正在考虑更改快捷方式。对于到目前为止的任何人,我有最后一个问题:IDE 应该如何了解环境SSH_AUTH_SOCK变量?我没看到。VSCode 似乎不会~./bashrc在启动时运行,仅在终端上运行。也许这是 VSCode 版本不同的行为?

各种各样的

最后你可以做的事情是:确保你的环境变量GIT_SSHGIT_SSH_COMMAND是空的(你还没有使用它们,并且忘记了)。git config 也是如此sshCommand。(我已经指出了C:/Program\\ Files/Git/usr/bin/ssh.exe)。

  • @DouglasYoung:根据我的解释,你的行为是预期的。要让“同步”按钮也正常工作,请尝试从终端(具有“SSH_AUTH_SOCK”环境变量)启动 VSCode。如果需要,请使用 VSCode 终端,但关闭第一个 VSCode 实例。基本上,解释是 VSCode 终端已知的环境变量与 VSCode 本身已知的环境不同(后者填充第一个环境)。祝你好运。 (2认同)

小智 5

除了 Alexandr Pilgun 的回答之外,还有一些其他信息对我产生了影响。

在第 4 步,我需要提供双反斜杠。VSCode 抱怨找不到 ssh.exe。使用双反斜杠看起来像这样:

git config --global core.sshCommand C:\\Windows\\System32\\OpenSSH\\ssh.exe
Run Code Online (Sandbox Code Playgroud)

我使用的是 Windows 10.0.19042 企业版