在 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_author
或git@example_committer
而不是git@example.org
(例如,git remote set-url git@example_author:org1/project1.git
)。
【讨论】:
以上是关于在 ssh-agent 中同时加载两个 ssh-keys 时,克隆(更新)git 子模块失败的主要内容,如果未能解决你的问题,请参考以下文章