使用SSH从VSTS克隆Git仓库时需要密码!出乎意料。

8
目标是在Visual Studio Team Services中克隆一个Git存储库,而不提供任何密码。进一步的目标是完全非交互式地完成此操作,不需要任何提示。
问题描述:
操作系统是Windows Server 2016。假设我的用户名是batman。我已经在Windows上设置了私钥(没有密钥)。私钥位于“C:\Users\batman\.ssh\id_rsa”。
我已经在VSTS上为我的用户帐户添加了公钥,一切正常。
我想要克隆存储库,并且VSTS Web UI为我提供了一个SSH URL以访问该存储库。我将其用于以下要执行的命令:
git clone ssh://mycompany@mycompany.visualstudio.com:22/MyProject/_git/MyRepo
响应:
Cloning into 'MyRepo'...
Enter passphrase for key '/c/Users/batman/.ssh/id_rsa':
mycompany@mycompany.visualstudio.com's password:

首先,它要求输入密钥密码,我只需按Enter键即可,但最后一行很令人困惑。我应该输入什么密码?为什么它在询问?如何使它不再询问?如何使克隆命令完全不询问任何内容?

3个回答

7

首先,它会要求输入您私钥的密码:

Enter passphrase for key '/c/Users/batman/.ssh/id_rsa':

根据您在现已删除的回答中的评论,我了解到您使用PuTTy生成了密钥,我怀疑您的密钥格式不正确(也许这可以帮助您?)(或者这个?),请确保它以以下内容开头:

-----BEGIN RSA PRIVATE KEY-----

并以此结束
-----END RSA PRIVATE KEY-----

无论如何,公钥认证失败后,它会要求输入mycompany账户的密码:
mycompany@mycompany.visualstudio.com's password:

如果公钥认证成功,这种情况就不会发生。

太好了,就是这样!密钥格式不同。现在我从Putty Key Generator导出密钥为“OpenSSH密钥”,现在clone不会像目标那样提示任何内容。谢谢! - alvarez
哇……如果它能提示口令不匹配就好了。这个问题的一半是因为你不能像在Ubuntu bash终端一样优雅地将密码粘贴到Windows控制台中。 - Jay Killeen

5
在我的理解中,“... visualstudio.com的密码”消息是公钥身份验证失败的明显标志(我认为这应该成为错误消息的一部分)。在大多数情况下,这意味着找不到私钥文件或其格式无效。
对我来说,解决方案很容易-只需修改.ssh/config文件(我在Windows和Mac上都使用OpenSSH)。我在Microsoft Docs的此页面底部找到了正确的设置。
将此内容粘贴到.ssh/config文件中后,所有内容都开始完美地运行:
# Most common scenario: to use the same key across all hosted Azure DevOps
# organizations, add a Host entry like this:
Host ssh.dev.azure.com
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

# This model will also work if you still use the older SSH URLs with a
# hostname of vs-ssh.visualstudio.com:
Host vs-ssh.visualstudio.com
  IdentityFile ~/.ssh/your_private_key
  IdentitiesOnly yes

2

使用以下命令查看日志:

GIT_TRACE=1 GIT_SSH_COMMAND="ssh -vvv" git clone ssh://pathToYourRepo

在大多数情况下,问题是由于在.ssh目录中缺少默认名称id_rsa的私钥而导致的。您可以通过在使用ssh-keygen生成密钥时不指定密钥名称提示,允许使用默认名称"id_rsa"来解决此问题。

如果您必须使用不同的密钥,则可以使用以下命令指定其路径:

 ssh-agent bash -c 'ssh-add ~/.ssh/anotherKey; git clone ssh://pathToYourRepo'

最后请确保您正在克隆ssh版本的路径而不是https(请注意路径以ssh://开头而不是https://),并且在将公钥复制到服务器的密钥列表中时没有任何空格。


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