Git Bash 和 Pageant 没有使用密钥

Posted

技术标签:

【中文标题】Git Bash 和 Pageant 没有使用密钥【英文标题】:Git Bash and Pageant are not using keys 【发布时间】:2016-05-08 16:43:31 【问题描述】:

我已经安装了适用于 Windows 的 Git(针对 MinTTY 和 PuTTY\plink.exe 进行了配置)和 PuTTY,并且我正在尝试让它与 Bitbucket 存储库一起使用。我已经在 Pageant 和网站上加载了我的 SSH 密钥,但每当我尝试做任何需要拉/推的事情时:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

当我运行建议的ssh -v hg@bitbucket.org 时,它使用id_rsa,但~/.ssh 中没有我的其他键。尝试使用 ssh-add ~/.ssh/bitbucket_rsa 会导致:

Could not open a connection to your authentication agent.

我已经阅读了有关配置 PuTTY 以允许转发的信息,但这通常是建议结束的地方,所以我只是将此选项设置为默认会话并将其保存在那里。

我已经运行ps 来检查哪些应用程序正在运行,而ssh-agent 不在其中。运行eval 'ssh-agent' 会启动守护进程,但没有任何区别。

【问题讨论】:

这里有一个很好的解决方法:cgranade.com/blog/2016/06/06/ssh-keys-in-vscode.html 【参考方案1】:

确保您已使用 ssh url 而非 http url 克隆了您的存储库

要检查,请使用git origin --remote -v

如果远程 url 是像下面这样的 http url

origin  https://username@example.com/username/repo.git

使用git remote set-url origin命令更改远程url,例如:

git remote set-url origin git@example.com:username/repo.git

【讨论】:

【参考方案2】:

对于未来的谷歌员工,

就像 @CTS_AE 所说的那样做,或者你可以在提升的 powershell 中运行它

[Environment]::SetEnvironmentVariable("GIT_SSH", "C:\Program Files\PuTTY\plink.exe", "Machine")

【讨论】:

【参考方案3】:

这就是最终对我有用的东西。

顺便说一句,我在 Windows 上也有 Bash,但我认为这并不重要。

我安装了 Sourcetree,并用 plink.exeputtygen.exepageant.exe 指向它的文件夹。您也可以单独下载并安装它们。

配置 Windows 环境变量

    在 Windows 10 搜索栏中键入 Environment。否则,打开系统属性/高级系统设置并找到您的环境变量。 添加新的系统变量 变量名称:GIT_SSH 变量值plink.exe 文件的完整路径(您可能在同一文件夹中也有 pageant.exeputtygen.exe)。

    我的是:C:\Program Files (x86)\Atlassian\SourceTree\tools\putty\plink.exe

    注意:较新版本的 Sourcetree 似乎安装了 %localappdata%。这些工具位于%localappdata%\SourceTree\app-x.x.x\tools\putty

    注意:较新的 Sourcetree(Windows 上的 v2)使用版本化目录,因此每次更新它时,您都必须更新它,这很痛苦。最好只复制plink.exe 并将其放在不会更改的地方。

    如果您有上述任何程序在运行,您可以随时打开任务管理器,找到进程,然后打开文件夹位置以获取plink.exe 的路径。

利润

确保重新启动您的终端,以便它们获得更新的环境变量。对我来说,我在Visual Studio Code 中为我的集成终端运行 Bash,所以我不得不重新启动 Visual Studio Code。关闭集成终端并打开一个新终端肯定是可以接受的,但我也希望 Visual Studio Code 中内置的 git 功能也能正常工作。

注意

鉴于我安装了 Sourcetree,我能够使用它的界面从 Bitbucket 中克隆出来并通过其界面推送,但尝试通过终端无法正常工作,因为它们使用了不同的凭据集。

要指出的另一个有趣的事情是,如果您导航到位于./.git/config 的项目的 git 配置,您可以将远程从使用 SSH 换成 HTTPS。您可以从您的 Bitbucket 存储库中的 Overview 中获取以下值。

ssh 布局:git@bitbucket.org:USERNAME/REPO_NAME.git https 布局:https://USERNAME@bitbucket.org/USERNAME/REPO_NAME.git

我注意到在 Windows 10 上使用 HTTPS 时,它会使用 Windows 凭据管理器(我尝试将我的凭据添加到它,同时我自己也想弄清楚,但我仍在使用 SSH,所以没关系)当你去与远程存储库进行交互,它会提示您输入您的凭据并将它们存储起来以供以后在 Windows 凭据管理器中使用:)

希望其中一种方法对您有用。 HTTPS 方法将跳过整个 SSH 密钥生成并将其推送到 Bitbucket,但对我来说感觉更安全和便携。

Mac 操作系统

您可能需要将您的密钥添加到钥匙串中,尤其是当您使用 Visual Studio Code 并且密钥上有密码时(目前 Visual Studio Code 不允许您输入密码)。

ssh-add -K ~/.ssh/id_rsa

https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#adding-your-ssh-key-to-the-ssh-agent

补充

我不确定这些是否对某人有帮助,但我一直在关注 Visual Studio Code for Windows 的 SSH 支持:https://github.com/Microsoft/vscode/issues/13680。

https://github.com/PowerShell/openssh-portable https://github.com/rupor-github/ssh-agent-wsl

【讨论】:

关于 VSCode 的评论。显然我已经尝试在 VSCode 中使用 Power Shell 并且设置不起作用没有重新启动 VSCode。我在添加GIT_SSH 之前启动了终端一次,然后按下Kill Terminal 并创建一个新实例。 npm install 仅在 VSCode 重启后才识别 ssh 密钥。 设置 GIT_SSH 后,您可以通过运行$GIT_SSH -v git@github.com 进行测试。最后,您应该会收到一条友好的消息:“Hi !您已成功通过身份验证,但 GitHub 不提供 shell 访问权限。” ` “较新的 Sourcetree(Windows 上的 v2)使用版本化目录,因此每次更新它时,都必须更新它,这很痛苦。” --- 我按照这些步骤,将 SourceTree 从 3.0.17 更新到 3.1.2 并且它实际上仍然有效,而无需我更新路径。不知道为什么? @MTran 如帖子中所述,您可以复制它们或下载它们并将它们放在不会更改的目录中。它们不必在那个目录中,它们恰好包含在 Sourcetree 中。【参考方案4】:

Windows 7 的 Git Bash 对我有用:将 .pkk 文件转换为 OpenSSH 格式:

https://www.simplified.guide/putty/convert-ppk-to-ssh-key

在 Git Bash 中将生成的密钥添加到 IdentityFile .ssh/config,例如:

Host repository
     # My converted OpenSSH key
     IdentityFile /c/Users/me/open-ssh.pri

     # This repository server uses a specific name, not usually needed.
     User git

     # This repository server uses a specific port, not usually needed
     Port 8322

     # Repository server full name
     Hostname repo.server.com

【讨论】:

【参考方案5】:

要从 Windows 上的 Git 附带的 Git Bash 访问在 Pegeant 中加载的 SSH 密钥,您可以使用 this program。安装过程在链接页面上进行了描述。

【讨论】:

【参考方案6】:

你把事情搞混了。

PuTTY 和 Pageant 与 OpenSSH 工具不兼容,无法一起通信。 PuTTY 无法从您的 OpenSSH 代理读取密钥,OpenSSH 无法从 Pageant 读取密钥。密钥格式也不同。这在这个世界上是一件坏事,但目前还没有解决方案。

“代理转发”也不同于“使用代理”。

如果您使用 plink 设置 Git(确保您确实这样做了),请检查您的 Pageant 是否正在运行,以及是否在 PuTTY 中存储的配置文件中的 Connection下检查了“尝试使用 Pageant 进行身份验证”选项> → SSH验证

如果它不能解决您的问题,请从 PuTTY 发布一些调试日志。

【讨论】:

我只尝试运行这些命令,因为似乎没有其他任何工作。恐怕我仍然不明白我应该在什么地方更改 PuTTY 中的这些设置。我应该创建一个专门为 bitbucket.org 配置的 PuTTY 会话吗? 你可以使用现有的。 我不确定发生了什么变化,因为我在所有连接上都设置了这个,但它不起作用。我打开了允许更改用户名的选项,它似乎有效(应该没关系,因为它应该与密钥本身匹配?),然后我禁用它,它仍然有效。 这就是我的答案。 here 是不同的、不兼容的密钥格式的示例。 事实证明,在我的 MINGW64 终端中使用 ssh-keygen 非常简单(至少比在 PuTTy 工具中四处点击要容易得多)。【参考方案7】:

您不需要 PuTTY 在 ssh 中使用 Bitbucket:打包在 git-for-windows 中的 OpenSSH 版本 (C:\prgs\git\PortableGit-2.7.0-64-bit\usr\bin\ssh.exe) 可以正常工作。

确保在当前的 shell 会话中,将 HOME 设置为 %USERPROFILE%PortableGit-2.7.0-64-bit\git-cmd.exe 足以打开正确配置的常规 CMD)。

%USERPROFILE%\.ssh 中创建一个名为config 的文件(如step 3 of the Atlassian documentation):

Host bitbucket.org
 IdentityFile ~/.ssh/bitbucket_rsa

(您也可以使用“/C/path/to/bitbucket_rsa”。)

这允许使用像bitbucket.org:user/repo 这样的SSH URL。 使用ssh -Tv bitbucket.org 对其进行测试(当然,在将您的公钥添加到您的 Bitbucket 帐户之后)。

注意:ssh-agent 仅在您的私钥受密码保护时才需要。

2018 年更新,两年后:“Say Farewell to PuTTY as Microsoft adds an OpenSSH Client to Windows 10”。 是时候放弃 putty 了:不需要不同的 (ppk) 密钥格式和 proprietary solution,现在 OpenSSH 已作为 Windows 功能正式分发(目前处于测试阶段,2018 年第一季度)。

【讨论】:

我知道我可以使用 OpenSSH。我不想。 @DissidentRage 然而,这就是 git 打包的东西,它工作得很好。 它应该适用于 PuTTY。我的工作机器可以正常工作,没有任何大惊小怪。如果一个答案不能使这个工作,它不会被标记为一个解决方案。 @DissidentRage 您是否已将 GIT_SSH 设置为 putty?您是否使用腻子将您的 openssh 密钥转换为 ppk 密钥,腻子实际上可以读取? (siteground.com/tutorials/ssh/putty.htm) 它是为 PuTTY\plink.exe 配置的,是的,Pageant 设置为使用自己的 .ppk 文件。

以上是关于Git Bash 和 Pageant 没有使用密钥的主要内容,如果未能解决你的问题,请参考以下文章

TortoiseGit使用ssh密钥连接git服务器

git小乌龟使用教程 快来看看

当Pageant完成加载SSH密钥时运行批处理文件

来自Windows服务的Plink无法找到Pageant

启动 Pageant SSH-Agent 并加载文件夹中的所有密钥

在 Pageant 完成加载 SSH 密钥时运行批处理文件