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

58

我正在尝试使用SSH从VSCode访问Bitbucket,但始终收到permission denied (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

我的环境:

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

对我而言,问题归结为一个问题:为什么vscode没有使用正确设置的Windows本机ssh服务,而是依赖于git bash ssh代理?

免责声明:我花了数小时阅读关于此主题的帖子并进行了一些设置调整。我怀疑问题与Windows10下网络驱动器延迟部署有关(已知问题)。我的Windows组策略设置为在启动/登录时等待网络。

6个回答

144

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

在第一条命令之后,我收到以下错误提示:PS C:\Users\Tim> Get-Service -Name ssh-agent | Set-Service -StartupType Manual Set-Service: 由于以下错误,无法配置服务“OpenSSH Authentication Agent (ssh-agent)”: 拒绝访问。 - Timberman
5
您需要以管理员身份运行Windows Powershell(右键单击“以管理员身份运行”)。否则,您将会收到“拒绝访问”的错误提示。 - RootAtShell
2
@PasanJayawickrama 或许你想用 Set-Service -StartupType Automatic 代替。 - priyabagus
有人能告诉我 Linux 的等效命令吗?它是否只是 git config --global core.sshCommand /usr/bin/ssh?我尝试了一下,但似乎并没有解决 Ubuntu 20.04 上 VS Code 的问题。 - zoltankundi
哎呀,糟糕了。这些步骤破坏了我的设置,之前使用 turtoise-git + pageant + ppk 密钥都很好用。我该如何恢复这些命令? - Eric Duminil
显示剩余2条评论

12

假如有人在Mac系统中正在寻找答案

ssh-agent

ssh-add之后,输入您的密码短语


7

我已经遇到这个问题很久了,终于找到了解决方法!

注意,我的电脑是Windows 10。

有很多可能导致这个问题。其中一些在其他答案中都有提到过。 此外,随着时间的推移和各种不同版本的VSCode(或VS或GitHub Desktop或其他使用git的程序),情况也会不同。有一次自动更新OpenSSL也是罪魁祸首。 简而言之,弄清楚发生了什么事情是一团糟。

我还有两点要补充,可以用来调试并找出问题所在:

  1. PATH相关
  2. SSH_AUTH_SOCK相关

PATH

我们需要验证的是IDE使用的git.exe是否与终端上的相同。

每当你在Git Bash for Windows(从现在开始称为“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版本。通过运行which gitwhere git(后者会显示所有在PATH上都有的git),可以找到bash的git版本。

我标准化使用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结合起来,这也不是一个好的解决方案:
- Powershell也不会写入.env文件,因此bash不会知道有关ssh-agent的信息。这就是为什么-StartupType Automatic在终端中没有影响的原因。如果你看到有多个ssh-agents被生成,那么这可能是原因之一。 - Powershell也不从.env文件中读取,因此它不知道bash实例化的ssh-agent
您可以通过设置环境变量来启动IDE,例如通过对比以下内容来确认这是实际问题:
- code ./your-project(会导致权限被拒绝),与 - export SSH_AUTH_SOCK=/tmp/ssh-...your/agent...; code ./your-project(假设ssh-client已经启动并且填充了,即在其他地方已调用了ssh-add)。
您可以通过运行ssh-agent来查找代理的套接字,它将打印出来(否则您尚未启动它或添加过您的密码短语)。
现在的问题是如何让VSCode知道SSH_AUTH_SOCK。上面列出了一些方法(例如这里),这些方法有时对我有效,但并不总是/当前。我也不知道那会怎么工作。如果您知道,请告诉我。
如果您从终端启动vscode并导出SSH_AUTH_SOCK,那么它将可以访问ssh-agent,但是如果您从开始菜单或其他快捷方式启动vscode,则不会具有该环境变量。您无法在系统启动时将其设置为全局环境变量,因为该值在运行ssh-agent时才被分配,太晚了。
所以目前我就这么做了。我通过vscode终端重新启动vscode。这并不是很令人满意。我正在考虑更改快捷方式。我最后一个问题是:任何到达这里的人都知道IDE如何了解 SSH_AUTH_SOCK 环境变量吗?我没有看到它。对于启动项,VSCode似乎不运行〜/ .bashrc,仅针对终端。也许这是在不同VSCode版本中变化的行为?
杂项
最后一件事情:确保您的环境变量GIT_SSHGIT_SSH_COMMAND为空(即您没有修改过它们并且忘记了)。git配置 sshCommand 也是如此。(我的指向C:/Program\\ Files/Git/usr/bin/ssh.exe)。

1
我喜欢这个解决方案,但是对于那些不想因为某些原因更改他们的$PATH的人来说 - 你可以在vscode中设置git.path值。路径可能类似于"git.path": "C:/Program Files/Git/mingw64/bin/git.exe" - djsmiley2kStaysInside
这个答案对我有帮助,但我不确定症状是否完全相同。最终我从运行了ssh-agent和ssh-add并输入了我的密码的终端启动了VSCode。 我之前遇到过这个问题,通过在VSCode内部的终端上运行ssh-add解决了它,但这次没有起作用。 *它半成功了,在终端内我可以进行推送/拉取以同步,但如果我点击VSCode源代码控制侧边栏菜单上的“同步”按钮,它会出现错误。 看来VSCode有一个与终端分离的配置或环境,但我不知道如何控制/刷新它。 - Douglas Young
2
@DouglasYoung:根据我的解释,你的行为是可以预料的。如果想让“同步”按钮也能正常工作,请尝试从终端启动VSCode(该终端具有SSH_AUTH_SOCK环境变量)。如有需要,可以使用VSCode终端,但请关闭第一个VSCode实例。基本上,解释是VSCode终端所知道的环境变量与VSCode本身所知道的环境变量不同(后者也会填充前者)。祝好运。 - JBSnorro
@JBSnorro 没错,这正是我的想法。我只是不知道为什么以前没有遇到这个问题。我相当确定(但我可能记错了哈哈),在VSCode终端上执行ssh-add之后,“同步”按钮可以使用,这让我认为VSCode应用程序和终端是相互关联的,但根据我的当前经验来看似乎并非如此。 - Douglas Young
1
@DouglasYoung 是的,我也看到了。就像我说的:“这可能是随着VSCode版本而有所变化的行为”。 - JBSnorro

5

除了Alexandr Pilgun的答案外,还有一些对我很有帮助的额外信息。

在第4步中,我需要提供双反斜杠。 VSCode报错说找不到ssh.exe。使用双反斜杠的形式如下:

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

我使用的是Windows 10.0.19042企业版。


我也尝试了这个解决方案,现在我知道出现了“Cloning into 'C:\Users\yamab\Source\Repos\prdb-intro'... C:\Windows\System32\OpenSSH\ssh.exe: C:\Windows\System32\OpenSSH\ssh.exe: No such file or directory Error encountered while cloning the remote repository: Git failed with a fatal error. Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.´´´´”的错误信息。 - Tanuki

2
在Windows系统中,我必须从bash中启动VS Code。
> code

那么它继承了我在.bashrc中使用的加载ssh代理密钥的内容。有些不便,但如果我在VS Code中工作,我通常也会打开bash。

JBSnorro在上面更详细地描述了这个过程。

此页面底部推荐此方法: https://code.visualstudio.com/Docs/editor/versioncontrol


这是在Windows上使用Git的解决方案。 - aleksander_si

0

我通过使用Windows安全通道库来处理HTTPS连接,解决了这个问题。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接