使用ssh-agent时,TortoiseGit与openssh密钥无法进行身份验证

59

我正在Windows XP上设置一个git环境(msysGit 1.7.11,TortoiseGit 1.7.14),尝试实现以下几点:

  • 使用不同于默认端口22的端口进行ssh连接
  • ssh认证由ssh-agent处理

因此,我创建了一个~/.ssh/config文件:

Host gitbox
   User gitolite
   Hostname XX.XX.XX.XX
   Port 154
   PreferredAuthentications publickey
   IdentityFile "/c/Documents and Settings/kraymer/.ssh/id_rsa"

当使用git bash CLI时,一切都按预期工作。

我在TortoiseGit方面遇到了困难。
我最初使用Plink安装了TortoiseGit,并使用Pageant加载ssh私钥。自动认证(Pageant)有效,但是由于TortoiseGit无法识别以gitolite@gitbox/repo.git格式为形式的git仓库url,所以设置失败。

然后,我决定使用openssh客户端安装TortoiseGit,这样可以使ssh客户端读取config文件,并模拟git CLI设置。
我在TortoiseGit设置中选择了随msys git一起提供的ssh.exe作为ssh客户端。
当执行git pull时,远程url现在已解析,但是会要求输入密语密码,而我期望进行ssh-agent自动认证。

https://dl.dropbox.com/u/1026715/tortoisegit.png

有没有可能使TortoiseGit与ssh-agent配合工作?
或者让TortoiseGit(Plink)能够识别.ssh/config

编辑#1

根据@VonC的建议,我配置了$HOME变量。
当我在TortoiseGit中点击显示环境变量时,现在有:

 HOME=C:\Documents and Settings\kraymer  
 HOMEDRIVE=C: 
 HOMEPATH=\Documents and Settings\kraymer 

但是,git pull 仍然需要我输入密码。


默认情况下,Git或Bash不会与ssh-agent一起工作,因为它们使用自己的ssh.exe。我想使用系统的ssh.exe(对于Win10,它位于“C:\ Windows \ System32 \ OpenSSH \ ssh.exe”)。您可以将其放入TortoiseGit:设置>网络> SSH> SSH客户端。另外,我还在Git和Bash中使用系统的ssh.exe,并使用上述路径设置了GIT_SSH环境变量。 另一种方法是在此处进一步描述的,即单独使git内置的ssh.exe与ssh-agent配合使用,但需要为Bush,为Git,为TortoiseGit配置Putty...有不同的方式。 - nzim
10个回答

139

无需任何调整。

只需让TortoiseGit指向与git本身使用的相同ssh客户端,如下图所示:

enter image description here

根据评论中Aleksey Kontsevich提到的最新版本的Git,这应该是C:\Program Files\Git\usr\bin\ssh.exe


62
最新的Git版本中,它是C:\Program Files\Git\usr\bin\ssh.exe。 - Aleksey Kontsevich
1
经过许多困难,我找到了这一个方法,并认为这是完成它的方式。只需在git-bash中设置身份,然后在Tortoise中使用即可。 - Totte Karlsson
2
如果你在安装Tortoise Git时使用git ssh客户端代替他们“推荐”的客户端,那么这一步骤可能是可以避免的。 - Mike Pone
1
似乎在TortoiseGit(我的版本为2.5.0.0 64位)中存在一个错误,如果更改SSH客户端,则“确定”按钮不起作用。为了解决这个问题,我也点击了“启用代理服务器”。然后重新打开对话框以检查状态是否正确(因为我没有输入任何代理设置,所以它再次取消选中)。 - Martin Capodici
6
在我的情况下,没有 C:\Program Files\Git\usr\bin\ssh.exe,但我找到了 C:\Windows\System32\OpenSSH\ssh.exe 这个似乎可用。 - vsync
显示剩余5条评论

6

Windows10系统
#TortoiseGit
在网络部分
从:C:\Program Files\TortoiseGit\bin\TortoiseGitPlink.exe
到:"C:\Users{user}\AppData\Local\Programs\Git\usr\bin\ssh.exe"

输入图像描述


4
  1. Cygwin

请按照以下文章描述的方法进行操作:https://help.github.com/articles/working-with-ssh-key-passphrases

在cygwin会话启动时只需要一次输入密码。 !!! 在退出cygwin会话前不要忘记杀死ssh-agent进程(使用ps找到进程PID并执行kill -9命令)。

我们对于cygwin使用单独的方法,因为cygwin由于某些原因无法看到在windows环境下外部启动的进程。

2, 3) MsysGit, TortoiseGit

有用的链接:http://dogbiscuit.org/mdub/weblog/Tech/WindowsSshAgent

安装MsysGit。 安装TortoiseGit(在安装过程中选择openssh而非plink)。 !!! 检查系统变量。如果存在GIT_SSH变量,请将其删除。

转到TortoiseGit->设置->常规

将Git exe路径设置为/bin 将外部dll路径设置为/mingw/bin

转到TortoiseGit->设置->网络 将SSH客户端属性设置为/bin/ssh.exe

定义系统变量SSH_AUTH_SOCK=C:\temp.ssh-socket

启动cmd.exe并执行以下命令(由于我们安装了MsysGit,所有以下命令都可以在cmd中访问——/bin已添加到系统PATH变量):

# following command is required to execute for avoiding Address already bind message when ssh-agen is not started yet but .ssh-socket exists after previous agent session
rm "%SSH_AUTH_SOCK%"

# Starting ssh-agent
ssh-agent -a "%SSH_AUTH_SOCK%"

# Adding our openssh key
ssh-add "%USERPROFILE%\.ssh\id_rsa"

# Type password for your key

就是这样。从那一刻起,您可以在不提示密码的情况下使用TortoiseGit和MsysGit执行git push、git pull。

当ssh-agent不再需要时,您可以通过Windows任务管理器将其终止。


4

看起来有很多解决方案可供选择。由于以上方法都未能奏效,我想分享一下对我有帮助的方法。

Screenshot: Network settings / Git SSH Client

在“设置...-> 网络-> SSH-> SSH客户端”中,将客户端设置为“C:\Program Files\TortoiseGit\bin\TortoiseGitPlink.exe”。使用Pageant,您将自动进行身份验证,否则您将被要求输入私钥密码。确保在推送对话框中选中“Autoload Putty Key”选项。

这对我在Windows 10上使用64位Git for Windows同样有效,因为我使用Putty + Pageant组合来访问公司服务器的SSH。此外,我的环境变量GIT_SSH设置为C:\ Program Files \ PuTTY \ plink.exe - Chris

4
我最初使用Plink安装了TortoiseGit,并使用Pageant加载ssh私钥。虽然自动认证(Pageant)起作用了,但配置失败了,因为TortoiseGit无法识别git仓库的URL格式为gitolite@gitbox/repo.git。
最终,我找到了一个解决方法,即创建一个与ssh别名相同的PuTTY会话(即问题中的“gitbox”)。这样,在命令行中就可以克隆成git clone gitbox/monrepo,而TortoiseGit会正确处理origin语法。

3

以上的答案都对我没用。

我创建了这个批处理文件来解决这个问题。

CALL "C:\Program Files\Git\cmd\start-ssh-agent.cmd"
SETX SSH_AUTH_SOCK "%SSH_AUTH_SOCK%"
SETX SSH_AGENT_PID "%SSH_AGENT_PID%"

运行一次,输入您的密码短语。

然后,您可以使用tortoisegit和openssh而无需为每个操作输入密码短语。


我也无法让TortoiseGit与上述任何解决方案配合使用。只有这个对我有效。谢谢! - cinico

2

我以为那就是解决方法了,但事实上没有任何改变(请参见编辑#1)。关于http://serverfault.com/a/198614,只是为了确保:每个远程密钥只有在使用Putty密钥而不是openssh时才需要提及吗? - kraymer
@kraymer,你试过使用远程仓库地址 gitbox:repo.git 吗? - VonC
使用OpenSSH客户端(我的首选)尝试了两种方法(使用完整的ssh://...地址和gitbox别名),两种方法都可以,但它一直要求我手动输入密码。 - kraymer
@kraymer,你的ssh-agent是否在定义了%HOME%的环境中运行? - VonC

2
由于这里的解释有点过时,我决定发布我的解决方案。
我在Windows 10中使用Git Bash和TortoiseGit 2.8.0,这些现在很常见。
我将ssh.exe设置为SSH客户端,在“设置->网络”中解释了先前的帖子。
我创建了一个脚本,其中包含以下命令,如先前的评论所述。您可能还想设置一个HOME环境变量,以防您的系统不会自动执行此操作。假设您的主目录位于H:\驱动器中,您可以添加以下行:
SETX HOME /h
CALL "C:\Program Files\Git\cmd\start-ssh-agent.cmd"
SETX SSH_AUTH_SOCK "%SSH_AUTH_SOCK%"
SETX SSH_AGENT_PID "%SSH_AGENT_PID%"

我将脚本添加到启动文件夹中,使用Win徽标+Rshell:startup。或者,您可以将脚本添加到注册表中,以确保它在其他进程之前运行:


HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

请确保输入exit以关闭控制台并允许变量为未来的进程设置。翻译后的内容为:

请确保输入exit以关闭控制台并允许变量为未来的进程设置。


1
如果您在存储库中使用RSA密钥,请按照上述说明将其添加到脚本的末尾。
CALL "C:\Program Files\Git\cmd\start-ssh-agent.cmd"
...
"C:\Program Files\Git\usr\bin\ssh-add"  ~/.ssh/myid.rsa

适用于Git 2.24.0、TortoiseGit 2.9.0、Windows 10,不需要使用Putty。

0
这是我如何使用我的Github ed25519密钥对与OpenSSH、TortoiseGit和Windows 10进行身份验证的方法。
  • 没有“autoload putty key”
  • 没有Pageant
  • 没有Plink
  • 没有远程选项卡中的Putty密钥
  • 没有凭据助手
  • 没有凭据(设置为None)

将密钥对文件重命名为C:\Users\user\.ssh\id_ed25519

打开C:\Users\user\.ssh\id_ed25519的高级安全属性,将继承的权限转换为显式权限,仅保留SYSTEM和当前用户,否则会出现错误。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\Users\\user/.ssh/id_ed25519' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "C:\\Users\\user/.ssh/id_ed25519": bad permissions

验证对github的访问权限:
ssh -vT git@github.com

正面确认看起来像这样:
Hi myusername! You've successfully authenticated, but GitHub does not provide shell access.

将网络选项卡中的SSH客户端更改为 C:\Program Files\Git\usr\bin\ssh.exe 更改远程源URL:
之前
https://github.com/myusername/ShellExtContextMenuHandler.git

之后

git@github.com:myusername/ShellExtContextMenuHandler.git

最不直观的障碍是远程源URL的格式。无论乌龟设置如何,HTTPS URL样式都会触发凭据挑战,而后者,SSH样式URL会导致乌龟允许SSH.exe处理身份验证。在Github上使用绿色的代码按钮时,请记得在复制URL之前切换到SSH样式。

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