[英]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
我的环境:
对我来说,问题归结为一个问题:为什么 vscode 不使用 windows native,正确设置 ssh 服务,而是依赖 git bash ssh 代理?
免责声明:我花了几个小时阅读有关此主题的主题并摆弄设置。 我怀疑这个问题与 Windows10 下网络驱动器的延迟部署有关(一个已知问题)。 我的 Windows 组策略设置为在启动/登录时等待网络。
Windows 10 允许使用所有默认的 OpenSSH 工具。 但是,每次我尝试通过 SSH 从 Github、Gitlab 或 Bitbucket 克隆存储库时,git 都会抛出权限被拒绝。 您需要进行一些调整才能使其正常工作。
Get-Service -Name ssh-agent | Set-Service -StartupType Manual
ssh-agent
ssh-add
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 的更新(这是自动的)也曾是罪魁祸首。 简而言之,弄清楚发生了什么是一团糟。
我还有两点要补充,您可以调试以弄清楚发生了什么:
PATH
相关的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.exe
和ssh-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 git
或where git
(后者将在PATH
上显示所有这些)。
我通过相应地调整PATH
来标准化在mingw64
中使用 git。
现在,如果您启用了ssh-agent
,则在终端中输入您的密码,您可能希望从那时起您的 IDE 也可以解析密码,因为它们使用相同的git.exe
,因此使用相同的ssh.exe
和ssh-add.exe
。
对于任何终端或 IDE 与ssh-agent
通信来说,唯一真正重要的是它知道它。 这完全由环境变量SSH_AUTH_SOCK
赋予(参见源代码)。 如果您的 IDE 或终端不知道此环境变量,它不会在ssh-agent
中找到密码。
重要的是要了解这个环境变量是如何在各种程序之间进行通信的。 这就是为什么 SO 上的许多答案会将其写入文件~/.ssh/agent.env
并在每个 bash 终端上读取的原因。 但这对 IDE 没有影响。 如果将它与 Powershell 结合使用,这也不是一个很好的解决方案:
.env
文件,所以 bash 不会知道 ssh-agent
-StartupType Automatic
在终端中没有影响.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_SSH
和GIT_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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.