git如何知道哪个ssh密钥用于其操作?

jay*_*rjo 9 git ssh github ssh-keys

我在里面有SSH密钥~/.ssh.其中很多都是.所以我想git知道当它尝试通过git@domain.com:group/repo.git端点连接到存储库时,该如何知道?

tor*_*rek 11

Git不知道,也不关心.它只运行ssh.

ssh怎么知道的?它会查看您的~/.ssh/config文件(编辑:或从ssh-agent获取它;请参阅下文):

Host github.com
    # IdentitiesOnly yes # see below to decide if you want this
    IdentityFile ~/.ssh/github_id_file

Host domain.com
    IdentitiesOnly yes # again, see below
    IdentityFile ~/.ssh/another_id_file
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个指向Linux版本的ssh_config文档的链接.虽然每个系统(MacOS,Linux,各种BSD,甚至Windows端口)都有自己的ssh配置处理风格,但它们都共享大部分配置.特别注意这两个项目(我已经为StackOverflow markdown略微调整了格式):

IdentitiesOnly

      指定ssh(1)应仅使用ssh_config文件中配置的身份验证标识文件,即使ssh-agent(1)或PKCS11Provider提供更多标识.此关键字的参数必须为"是"或"否".此选项适用于ssh-agent提供许多不同身份的情况.默认值为"no".

IdentityFile

      指定从中读取用户的DSA,ECDSA,ED25519或RSA身份验证标识的文件.缺省值是~/.ssh/identity 用于协议版本1,并且~/.ssh/id_dsa,~/.ssh/id_ecdsa, ~/.ssh/id_ed25519~/.ssh/id_rsa对于协议版本2.另外,由所述认证代理表示的任何身份将被除非用于认证IdentitiesOnly被设定.ssh(1)将尝试从通过将-cert.pub附加到指定路径获得的文件名中加载证书信息IdentityFile.

      文件名可以使用波浪号语法来引用用户的主目录或以下转义字符之一:'%d'(本地用户的主目录),'%u'(本地用户名),'%l'(本地主机名),'%h'(远程主机名)或'%r'(远程用户名).

      可以在配置文件中指定多个标识文件; 所有这些身份都将按顺序进行.多个IdentityFile指令将添加到尝试的身份列表中(此行为与其他配置指令的行为不同).

      IdentityFile可以与IdentitiesOnly结合使用,以选择在身份验证期间提供代理中的哪些身份.

正如Alexey Ten在评论中指出的那样,IdentityFile它的特点是它是附加的(而不是一次设置 - 覆盖 - 另一种).

您还可以使用其他-v选项运行ssh(手动)来跟踪连接.在Git中,您可以设置为临时跟踪GIT_SSH运行的脚本的名称ssh -vvv(或者对~/.ssh/config文件中的日志级别大惊小怪).我发现偶尔进行调试很有用.(请注意,您无法将选项传递给ssh via GIT_SSH,您需要一行脚本,例如ssh-vvv一行读取ssh -vvv $@.)

  • 如果您没有显式映射,ssh只会尝试所有映射 (2认同)