在 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_file
对keychain_read_passphrase
来自keychain.c
(该文件完全来自Apple)。
keychain_read_passphrase
使用ssh_add_identity_constrained
自authfd.c
将加载的密钥存储到代理中。
的唯一其他用户ssh_add_identity_constrained
是ssh-add.c
(ssh 添加);较低级别的“常量” ,SSH2_AGENTC_ADD_IDENTITY
并且SSH2_AGENTC_ADD_ID_CONSTRAINED
也只用于authfd.c
ssh-agent.c
(ssh 代理)。
因此通常只有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。在该设置中,我得到了问题中寻求的行为。