Cygwin中添加了SSH密钥,但Git提示“权限被拒绝(publickey)”

11

在尝试使用Cygwin与Git时,我遇到了一个问题。我已经生成并将ssh密钥添加到了GitLab服务器,并且通过MINGW64一切都可以正常使用(克隆、拉取等)。但是我想使用Cygwin,结果发现它不起作用。

虽然我已经将生成的密钥副本放到了~/user/.ssh文件夹中,并手动添加了密钥,所以"ssh-add -l"命令在列表中打印出来,但是当我尝试获取存储库(或任何其他服务器命令)时,我只会得到以下输出:

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

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

看起来像是一个bug,但可能是我做错了什么。 有人遇到过这个问题吗?谢谢。

更新:在Cygwin中更新OpenSSH版本后,描述的问题已经消失了。


你是否在 Git 服务器上添加了与 ssh-add -L 命令输出的相同的公钥? - Jakuje
是的,我已经将之前在Git Bash中有效的相同密钥添加到了Cygwin的用户文件夹中,并以相同的方式添加了它。而且,我的服务器和用户文件夹中也有相同的公钥。所以我对这种行为感到非常困惑。 - mmelnik
对于您来说,MINGW64和cygwin有什么区别?您在cygwin shell中是否拥有代理和连接,以便进行克隆操作? - Jakuje
我使用Cygwin作为NetBeans终端。而MinGW带有Windows便携式Git版本。没有理由不使用MinGW,但我试图设置Cygwin作为主要终端并卡在这里。@Jakuje,您所说的代理和连接是什么意思?我在Cygwin中运行代理,并且ssh-add对我很好用。 - mmelnik
3个回答

12

对我来说,问题在于我把我的SSH密钥文件放在C:\Users\username\.ssh目录下(在Cygwin中是/cygdrive/c/Users/username/.ssh),但实际上,你需要把你的SSH密钥放在~/.ssh目录下才能使其正常工作。这两个目录是不同的。

在Cygwin中运行以下命令解决了我的问题。

cp /cygdrive/c/Users/username/.ssh/* ~/.ssh/

请注意,您应该将username替换为您实际的用户名。


这对我很有帮助。在Windows命令行中,Git可以工作,但在Cygwin bash命令行中无法工作。 - JackAce

3
如果您使用了非默认的文件路径来存储git SSH密钥对,那么您需要配置SSH客户端以便在连接到GitLab时能够找到您的git私有SSH密钥。
您需要运行以下命令进行修复:
eval $(ssh-agent -s)
ssh-add ~/.ssh/other_id_rsa

1
代理不必只在运行中,但您的工具必须知道代理正在侦听的位置。它存储在变量$SSH_AUTH_SOCK中,如果它在一个终端中适用于您,则不必从第二个终端中使用。
如果您想在NetBeans中使其正常工作,则需要将此变量注入到NetBeans环境变量中(但不确定如何执行此操作,以便从Windows环境传递到NetBeans中的Cygwin终端)。
或者稍后将其注入到正在运行的终端中(可能使用.bashrc或其他启动脚本)。简单的测试用例是在MinGW终端中键入echo $SSH_AUTH_SOCK,然后在Cygwin终端中写入export SSH_AUTH_SOCK=/the/path/you/got/from/previous/command
之后,您可以通过将变量存储在某个文件中来自动化该过程,然后可以在Cygwin中读取该文件。
# MinGW scriplet 
echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK" >> ~/agent_env

# Cygwin scriplet
. ~/agent_env

那么您应该能够在Cygwin shell中使用您的mingw代理。

谢谢您的回答!我明白了您的意思,但是我不清楚为什么我应该将MinGW代理放到Cygwin中,因为它们是两个不同的终端,运行不同的代理(不同的SSH_AUTH_SOCK)。而且它们还使用不同的.bashrc配置(大部分相同)和单独的资源文件夹(特别是Cygwin,它有自己的*nix-like基础设施)。您能解释一下吗?我之前提到过我已经在这两个代理中添加了我的密钥。 - mmelnik
1
问题在于它们都不是 Windows 的本地程序,两者都表现为独立的层位于本地 Windows 之上,并且彼此不知道(也没有合理的方法在不同的独立 shell 之间共享环境,因为 *NIX 进程被设计为从彼此继承环境,而第一个进程是您的会话,其中包含您所需的所有内容)。您可能可以从另一个 shell 运行一个 shell,但可能无法运行本地的 Windows 应用程序。 - Jakuje
这就是为什么我问你为什么我必须在两个shell之间共享代理。我一次只使用一个。让我们想象一下,以前我有MinGW,它运行得很好,但现在我想完全转向Cygwin,并且遇到了ssh密钥的问题,尽管所有配置对我来说似乎都很好。 - mmelnik
1
好的,你不一定需要这样做。但是如果代理在你的cygwin shell中无法工作呢?那么ssh -vvvT git@gitlaburl verify怎么办? - Jakuje
好的,我发现在Cygwin中有OpenSSH 6,而在MinGW中是7.1p1,所以我更新了它,突然一切都开始工作了。ssh -vvvT git@gitlaburl 在两种情况下都顺利通过验证,没有错误。 - mmelnik

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