繁体   English   中英

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

[英]VS Code / Bitbucket / SSH - Permission denied (publickey)

我正在尝试通过 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

我的环境:

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

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

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

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

万一有人在mac中寻找答案

ssh-agent

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

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

在第 4 步,我需要提供双反斜杠。 VSCode 抱怨找不到 ssh.exe。 使用双反斜杠如下所示:

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

我正在使用 Windows 10.0.19042 企业版

我有这个太久了,终于明白了!

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

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

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

  1. PATH相关的
  2. SSH_AUTH_SOCK相关

小路

我们需要验证的是,您的 IDE 使用的git.exe与您在终端上交谈的那个 git.exe 是同一个。

每当您在 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上显示所有这些)。

我通过相应地调整PATH来标准化在mingw64中使用 git。

现在,如果您启用了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-project export SSH_AUTH_SOCK=/tmp/ssh-...your/agent...; code ./your-project (假设ssh-client已启动并已填充,即ssh-add已在其他地方调用),则不会拒绝授予权限)。

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

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

如果您从导出SSH_AUTH_SOCK的终端启动 vscode ,那么它将可以访问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 )。

在 Windows 上,我必须从 bash 启动 VS Code。

> code

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

这就是 JBSnorro 在上面更详细地描述的内容。

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

通过使用用于 HTTPS 连接的 Windows 安全通道库为我解决了这个问题。

在此处输入图像描述

在此处输入图片说明

您也可以在 VSCODE 中“在终端中打开”您的文件夹。

在此处输入图片说明

从那里你可以继续推送你的更新git push origin master然后它要求输入密码短语并输入它然后它会继续。

我希望这可以帮助你们中的一些人快速解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM