【问题标题】:How does git know which ssh key to use for its operations?git 如何知道使用哪个 ssh 密钥进行操作?
【发布时间】:2021-11-30 08:44:36
【问题描述】:

我有 SSH 密钥,在 ~/.ssh 内。他们中的许多人实际上。所以我想知道git 在尝试通过git@domain.com:group/repo.git 端点连接到存储库时如何知道要使用哪个?

【问题讨论】:

  • > ssh 是怎么知道的?它会查看您的 ~/.ssh/config 它似乎没有为此使用 ~ (或 $HOME)。如果您将 HOME 更改为 /tmp/mystuff 它不会在 /tmp/mystuff/.ssh 中查找(我这样做的原因是通常我们的 nfs 挂载的 $HOME 目录不可用,所以我已经指出我的 $HOME (和 ~) 到本地文件系统。从使用 strace 开始,它似乎在查找 .ssh/config 之前先在 /etc/passwd 中查找(我想它也会在任何 nis 或 ldap 注册表中查找,如果那是用户家来自)。
  • id_rsa 文件的位置可以在 /etc/ssh/ssh_config 中更改

标签: git github ssh ssh-keys


【解决方案1】:

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 提供许多不同身份的情况。这 默认为“否”。

身份文件

      指定一个文件,其中用户的 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 附加到 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 $@。)

【讨论】:

  • 如果你没有明确的映射,ssh 只是尝试它们
  • 我似乎没有 ~/.ssh/config 文件。如果您用案例更新您的答案,也许还有一个关于如何创建此类文件的资源链接(据我所知,我知道我需要),我会接受这个。
  • 让我问这个问题的问题是,虽然我在 .ssh 中有很多键,并且在我的 gitlab 配置文件中至少定义了三个键,但只有一个让我通过。所以我想知道为什么会有这种偏好。
猜你喜欢
  • 2012-06-21
  • 1970-01-01
  • 2019-02-12
  • 2011-03-30
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 2019-11-11
  • 2021-03-02
相关资源
最近更新 更多