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)
我的环境:
对我来说,问题归结为一个问题:为什么 vscode 不使用 windows native,正确设置 ssh 服务,而是依赖 git bash ssh 代理?
免责声明:我花了几个小时阅读有关此主题的主题并摆弄设置。我怀疑问题与Windows10下网络驱动器的延迟部署有关(已知问题)。我的 Windows 组策略设置为在启动/登录时等待网络。
小智 56
Windows 10 允许使用所有默认的 OpenSSH 工具。但是,每次我尝试通过 SSH 从 Github、Gitlab 或 Bitbucket 克隆存储库时,git 都会抛出权限被拒绝。您需要执行一些调整才能使其正常工作。
Get-Service -Name ssh-agent | Set-Service -StartupType Manual
ssh-agentssh-addgit config --global core.sshCommand C:/Windows/System32/OpenSSH/ssh.exe我已经纠结了这么久了,终于明白了!
请注意,我使用的是 Windows 10。
有很多事情可能是错误的。其中一些已在其他答案中修复。而且随着时间的推移和各种 VSCode 版本(或 VS 或 GitHub Desktop 或其他使用 git 的程序),情况也有所不同。OpenSSL 的更新(自动)也曾经是罪魁祸首。总之,搞清楚到底是怎么回事真是一团乱。
我还有两点需要补充,您可以通过调试来弄清楚发生了什么:
PATHSSH_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.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)。
mingw64我通过相应的调整来标准化使用 git PATH。
现在,如果您启用了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-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_SSH和GIT_SSH_COMMAND是空的(你还没有使用它们,并且忘记了)。git config 也是如此sshCommand。(我已经指出了C:/Program\\ Files/Git/usr/bin/ssh.exe)。
小智 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 企业版
| 归档时间: |
|
| 查看次数: |
15728 次 |
| 最近记录: |