我在~/.ssh
内部有SSH密钥。其中很多都是。所以我想知道git
在尝试连接git@domain.com:group/repo.git
端点上的存储库时如何知道要采用哪一个?
答案 0 :(得分:10)
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
修改:这是指向a Linux version of the ssh_config documentation的链接。虽然每个系统(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
, 协议版本2的~/.ssh/id_ed25519
和~/.ssh/id_rsa
。 此外,身份验证表示的任何身份 除非IdentitiesOnly
,否则代理将用于身份验证 组。 ssh(1)将尝试从中加载证书信息 通过将-cert.pub附加到a的路径获得的文件名 指定IdentityFile
。文件名可以使用波浪语法来引用用户的家 目录或以下转义字符之一:'%d'(本地 用户的主目录),'%u'(本地用户名),'%l'(本地主机 name),'%h'(远程主机名)或'%r'(远程用户名)。
可以指定多个身份文件 配置文件;所有这些身份都将按顺序进行。 多个 IdentityFile 指令将添加到身份列表中 尝试过(此行为与其他配置不同 指令)。
IdentityFile 可与 IdentitiesOnly 结合使用 选择在身份验证期间提供代理中的哪些身份。
作为Alexey Ten noted in a comment,IdentityFile
是特殊的,因为它是加性的(而不是一次设置 - 覆盖 - 另一种)。
您还可以使用其他-v
选项运行ssh(手动)来跟踪连接。在Git中,您可以将GIT_SSH
设置为运行ssh -vvv
的脚本的名称以进行临时跟踪(或者使用~/.ssh/config
文件中的日志级别大惊小怪)。我发现偶尔进行调试很有用。 (请注意,您无法通过GIT_SSH
将选项传递给ssh,您需要一个单行脚本,例如ssh-vvv
,其中一行读取ssh -vvv $@
。)