如何让 git 使用 ssh-add(在必要时)?

如何让 git 使用 ssh-add(在必要时)?

在 Linux(CentOS,如果重要的话)上,我在使用 git 命令时遇到了问题。git 可以利用加载到 ssh-agent 缓存中的密钥,但如果未加载密钥,它似乎不会采取任何步骤来加载它们(例如调用 ssh-add)。

我已经像这样设置了 ~/.ssh/config:

$ cat ~/.ssh/config 
Host github.com
    User git
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github_id_rsa

我的系统已经设置了 ssh-agent。我相信它使用的是 Gnome 提供的实现(http://live.gnome.org/GnomeKeyring/Ssh)。

我可以使用“ssh-add”命令手动添加我的 github 密钥。当我这样做时,我可以看到密钥已使用“git add -l”加载,并且远程连接的 git 命令(例如“git remote update”)无需输入密码即可运行。

我仍然希望 git 命令执行以下操作:

  • 默认情况下,如果 ssh-agent 正在运行但尚未加载必要的密钥,则使用 ssh-add 将密钥加载到 ssh-agent 中。

  • 如果密钥文件不是默认文件名之一(例如“id_rsa”、“id_dsa”或“identity”),ssh-add 似乎需要帮助(通过参数)。这似乎是倒退。我有一个从主机名到 IdentityFile 的映射,如上所示,该映射在 ~/.ssh/config 中指定。ssh-add 不应该能够使用它吗?

还...

  • 为了简化问题,我尝试从 ssh-config 中删除“IdentityFile”映射,并将密钥文件重命名为默认名称(id_rsa 和 id_rsa.pub)。这确实允许“ssh-add”添加密钥而无需任何其他参数,但即使在这种简化的情况下,我也没有看到 git 命令将任何密钥添加到 ssh-agent 缓存中。

我的 MacOS(Snow Leopard)机器上有相同的 ~/.ssh/config,它似乎完全正确。但是如何在 Linux 中实现这种行为?我不确定这是否是由于 ssh-agent、ssh-add、git 或某种组合的实现或配置不同造成的。

编辑:经过进一步思考,我认为这应该与 ssh 工具(也许最重要的是 ssh-agent?)而不是 git 有更多关系。毕竟,对于尝试使用 ~/.ssh 中的密钥和设置建立 ssh 连接的任何进程(包括 ssh 命令本身),此行为都应该相同。

答案1

默认的 OpenSSH 不会做你想做的事。远程控制程序将使用已加载到配置的代理中的任何密钥,但它永远不会将密钥添加到代理中。

“向代理添加任何由远程控制”行为是由于苹果对远程控制它与 Mac OS X 捆绑在一起。


典型的运行远程控制将使用load_identity_file来自sshconnect2.c

苹果增加了load_identity_filekeychain_read_passphrase来自keychain.c(该文件完全来自Apple)。

keychain_read_passphrase使用ssh_add_identity_constrainedauthfd.c将加载的密钥存储到代理中。

的唯一其他用户ssh_add_identity_constrainedssh-add.cssh 添加);较低级别的“常量” ,SSH2_AGENTC_ADD_IDENTITY并且SSH2_AGENTC_ADD_ID_CONSTRAINED也只用于authfd.cssh-agent.cssh 代理)。

因此通常只有ssh 添加将密钥加载到代理中,但苹果扩展了远程控制当 GUI 提示输入密钥密码时,也会将密钥加载到代理中。

答案2

OpenSSHv7.2增加了对 的支持AddKeysToAgent

  • ssh(1):添加 AddKeysToAgent 客户端选项,可设置为
    “yes”、“no”、“ask”或“confirm”,默认为“no”。
    启用后,如果 ssh-agent 正在运行,则身份验证期间使用的私钥将
    添加到 ssh-agent(如果设置为“confirm”,则启用确认
    )。

苹果在 macOS 中采用了这种 OpenSSH 标准方式10.12.2

OpenSSH 将不再自动将密钥加载到 ssh-agent 中。这使 macOS 行为与上游 OpenSSH 项目的行为保持一致。

用户可以通过在 ssh 配置文件中设置此选项来重新启用将密钥加载到代理中:

AddKeysToAgent 是

答案3

简短回答:OpenSSH 不支持此功能,但它的修改版本或 ssh 相关工具的替代实现可以做到这一点。

较长的答案:

OpenSSH 不会这样做,原因在本页 Chris Johnsen 的回答中给出。但是,可以使用 Gnome Keyring 在 Linux 上实现此行为,它提供了自己的 ssh-agent。

在我发布的问题中,我说我以为我正在使用 Gnome Keyring(因为我正在使用 Gnome),但事实并非如此。我刚刚安装了 CentOS 5,在该设置中,我很确定正在运行的 ssh-agent 守护程序是来自 OpenSSH 的守护程序。

我再次尝试使用 Ubuntu 11.04,它肯定使用了 Gnome Keyring 的 ssh-agent。在该设置中,我得到了问题中寻求的行为。

相关内容