Git和SSH,使用哪个密钥?

169

假设您的.ssh目录中包含30个密钥(15个私钥和15个公钥)。

在Git中,如何查看使用哪个密钥连接到给定的远程存储库?

7个回答

115

.ssh/config 文件中添加以下条目即可解决问题。

  host git.assembla.com
  user git
  identityfile ~/.ssh/whatever

其中~/.ssh/whatever是私钥的路径。

此外,用户名和主机名可以从其他地方获取。

git push git@git.assembla.com:repo_name.git
         ^__ ^_______________
         user host

如果我想为另一个主机使用另一个ssh密钥,那么我只需要在第一个之后重复相同的操作吗?identityfile是否与其前面的第一个主机有关? - MikeSchem
好的,是的,看起来是这样的情况:https://www.cyberciti.biz/faq/force-ssh-client-to-use-given-private-key-identity-file/ - MikeSchem

106

在详细模式下执行ssh,即ssh -v user@host,将打印大量调试信息,其中还包含有关尝试登录的密钥文件的详细信息。

执行ssh时使用-v选项可以开启详细模式,这样会输出很多调试信息,其中包含了登录所需的密钥文件的详细信息。

debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/user/.ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 332
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).

现在,如果你结合Git自己的SSH帮助页面中的步骤4,ssh -vT git@github.com可以给你答案。

注意:你也可以使用-i开关告诉ssh在命令执行期间使用哪个密钥文件。


参见:https://dev59.com/ZmMk5IYBdhLWcg3w7CKX - Sharadh
1
你也可以使用grep命令来查找ssh命令的标准错误输出中的密钥文件,方法如下:ssh -vv user@host 2> >(grep Offering),这样会更加方便。最后一个文件应该是公钥。例如:debug1: Offering RSA public key: /Users/macbookpro/.ssh/id_rsa - Gianfranco P.
6
"Github"不等同于"Git"。 - ForeverWintr

46

我会说,对我的口味来说最实用的是:

GIT_SSH_COMMAND='ssh -v' git …

当然,具体情况而定,将其导出到当前SHELL环境可能会更有益,这样您就不必每次手动添加它。那么就应该这样:

当然,根据情况而定,只需将其导出到当前的SHELL环境中,这样您就无需每次手动添加它,这可能更有好处。那么做的话,就是这样:

export GIT_SSH_COMMAND='ssh -v'
git …

根据man ssh,您可以在使用-v选项时获取一些调试信息。如man git所建议的,有几个环境变量会影响Git在使用SSH时的操作。 (如果您还想了解更多,请查阅手册)。

使用了哪个密钥?

在输出中,您将看到类似于...

debug1: Offering public key: 

... 这就是你问题的答案。


4
是的。这应该是被接受的答案。为了在Windows CMD上实现它,使用以下命令:set GIT_SSH_COMMAND=ssh -v。这帮助我发现,在Windows上,ssh-config的Include-Path应该像这样:Include /C/Users/YourUserName.ssh/config,以便让ssh和git使用配置文件,然后使用一个HOST *条目来指定git/ssh使用的身份验证文件。 - icyerasor
@icyerasor 你的命令对我来说没有起作用,因为它认为 -v 属于 set。这个命令对我有效 $env:GIT_SSH_COMMAND='ssh -v' - Serj
惊人的答案,非常有用! - Berkay Berabi

24

如果没有在 .ssh/config 文件中指定私钥文件,SSH 将使用默认的私钥文件。

默认私钥文件是 ~/.ssh/id_rsa~/.ssh/id_dsa~/.ssh/identity,具体取决于协议版本。


当密钥被添加到已知主机中时? - darth vader

18

这可能有些边缘情况,但运行ssh -vT git@github.com后,我发现它正在检查/root/.ssh的密钥,而不是我期望的家目录下的密钥,后来发现我以root用户身份登录了!


这种技术,以及其他类似的“ssh”询问方式都是正确的解决方案。谢谢。 - daparic
这是最有用的答案,它真正展示了 SSH 密钥的使用方法。非常感谢。 - herve

8

由于git只是使用ssh进行连接,它将使用ssh用于连接到远程主机的任何密钥。有关详细信息,请参见~/.ssh/config文件;host块使用IdentityFile指令来指定要使用的私钥。完整详情请参阅ssh_config(5)手册页。


嗯..这个文件在我的系统上不存在。应该存在吗? - James Raitsev
1
@JAM 你使用的是哪个操作系统?有时候配置文件在/etc/ssh/ssh_config - user849425
我正在使用MACOS。发现/etc/ssh_config,看起来是一个充满注释条目的文件。 - James Raitsev
@sarnold 您可以自己创建 ~/.ssh/config - xdazz

2

在远程服务器上,编辑sshd_config文件,将LogLevel从INFO更改为VERBOSE并重新启动ssh。

现在你的日志文件将保存用于身份验证每个用户的密钥指纹信息。

在Ubuntu上,这些文件是:

/etc/ssh/sshd_config
/var/log/auth.log

但是在其他发行版上可能会有所不同。只需搜索它们的位置(例如,有些人使用 /var/log/secure)。


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