在 ssh-agent 中同时加载两个 ssh-keys 时,克隆(更新)git 子模块失败

Posted

技术标签:

【中文标题】在 ssh-agent 中同时加载两个 ssh-keys 时,克隆(更新)git 子模块失败【英文标题】:Cloning (updating) git submodule fails when two ssh-keys are loaded at the same time in ssh-agent 【发布时间】:2021-03-03 20:24:28 【问题描述】:

我正在处理几个 maven 项目,其中常见的 java 类被放置在一个子模块中。然后将子模块添加到每个 maven-project 中,并将项目从私有 github-repo 克隆到 docker 容器中。

我为每个项目和子模块创建了一个 ssh-key,将公钥添加到 github-repo 的“设置”中的“部署密钥”中。所有密钥都是在没有密码的情况下创建的。

下载 main-repo 正常,但添加子模块失败,git@github.com: Permission denied (publickey).。因此编译失败。这两个键都是在克隆 repo 和更新子模块之前加载的。

事实证明,我一次只能加载一个键。所以我修改了克隆脚本,以便在加载子模块的密钥之前卸载所有密钥。

eval $(ssh-agent -s)
ssh-add /home/docker/.ssh/id_ed25519_maven_repo
ssh-keyscan -H github.com >> /home/docker/.ssh/known_hosts

cd /home/docker/code
git clone git@github.com:foo/main.git
cd main

ssh-add -D   <--- Unload all keys ---
ssh-add /home/docker/.ssh/id_ed25519_submodule
git submodule init
git submodule update

mvn compile

为什么我必须在更新子模块之前卸载和加载,而不是同时加载两个键?

(花费数小时排除故障)

【问题讨论】:

子模块也托管在 Github 上吗?当git总是连接到同一个git@github.com时,应该如何区分使用哪个键?见***.com/a/8483960/7976758,见***.com/search?q=%5Bgithub%5D+multiple+accounts 感谢您澄清这一点。是的,这是在 github 上。我使用带有密码的 ssh 密钥拉/推其他存储库。并在我的笔记本电脑上创建了没有密码的密钥来测试流程。并且可以添加子模块。现在我看到我将它作为最后一个键加载,因此它起作用了。 【参考方案1】:

听起来您有两个 SSH 密钥,它们要么与不同的 GitHub 帐户相关联,要么是具有不同存储库的部署密钥。如果是这样,发生这种情况的原因是由于 SSH 协议。

当任何用户想要使用 SSH 密钥通过 SSH 连接到远程计算机时,身份验证发生在发送任何命令或了解所需行为之前。在这种情况下,所有用户都连接到github.com 上的git 用户,因此区分用户和他们拥有的访问权限的唯一方法是通过SSH 密钥。如果您使用特定密钥进行身份验证并且该密钥对 some 访问有效,GitHub 将接受它,然后如果它对您想要访问的内容无效,那么它将拒绝您的请求。

由于 SSH 协议在身份验证完成之前不允许指定要访问的资源,因此 GitHub 无法知道您是否真的想使用不同的密钥来访问该资源,而该密钥确实有能力访问它.

如果你需要为不同的资源使用多个 SSH 密钥,那是covered in the Git FAQ:

例如,您可以在~/.ssh/config 中编写如下内容,替换正确的私钥文件:

# This is the account for author on git.example.org.
Host example_author
    HostName git.example.org
    User git
    # This is the key pair registered for author with git.example.org.
    IdentityFile ~/.ssh/id_author
    IdentitiesOnly yes
# This is the account for committer on git.example.org.
Host example_committer
    HostName git.example.org
    User git
    # This is the key pair registered for committer with git.example.org.
    IdentityFile ~/.ssh/id_committer
    IdentitiesOnly yes

然后,您可以调整您的推送 URL 以使用 git@example_authorgit@example_committer 而不是 git@example.org(例如,git remote set-url git@example_author:org1/project1.git)。

【讨论】:

以上是关于在 ssh-agent 中同时加载两个 ssh-keys 时,克隆(更新)git 子模块失败的主要内容,如果未能解决你的问题,请参考以下文章

ssh-agent的使用

WSL的ssh-agent问题

ssh-agent代理的简单用法

sh 在脚本中使用ssh-agent

ssh-agent 没有在 CMD 中创建 [重复]

ssh-agent && 及 ssh-add介绍