![](/img/trans.png)
[英]Git repositories on shared hosting with ssh access - multiple users / one ssh account
[英]Git multiple SSH macos setup stuck on one account
我在我的 macos 上使用两个 Github SSH 密钥时遇到问题,它卡在重启后使用的第一个帐户上。
Background:
我的 mac 设置了两个 Github 帐户 - 一个用于personal
存储库,一个用于business
存储库。 商业回购是私人的。 个人回购是公开的,但只有我的个人帐户可以访问推送。
System setup:
我的系统和全局配置为空
~/.ssh/配置:
# business
Host business
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
UseKeychain yes
AddKeysToAgent yes
#personal
Host personal
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_personal
UseKeychain yes
AddKeysToAgent yes
个人reporoot/.git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[user]
name = personalgithubaccount
email = mypersonalemail@pm.me
[remote "origin"]
url = git@personal:mygithubuser/personalrepo
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
remote = origin
merge = refs/heads/main
businessreporoot/.git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[user]
name = businessgithubaccount
email = businessemail@businessdomain.com
[remote "origin"]
url = git@business:businessname/businessrepo
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "main"]
remote = origin
merge = refs/heads/main
在我重新启动计算机之前,一切都按预期工作。 当我尝试推送到我的个人存储库时,我注意到了这个问题。 它错误地说企业帐户无权推送到个人回购。
我花了几个小时尝试通过 Stack Overflow 和互联网文章,其中大部分建议删除我的 macos 钥匙串git
条目并从配置文件中删除 osxkeychain,但无济于事。 最后,求助于故障排除 101,我重新启动并中提琴,我可以推送到个人帐户,它现在使用我的个人凭据而不是我的企业凭据。
但是 - 然后我去了git pull
业务仓库,它说它无法找到仓库。 考虑到我遇到了互惠问题并且它现在卡在我的个人帐户上,我重新启动,提取业务回购并且它工作,但现在我无法推送到我的个人存储库,因为 git 试图再次使用我的业务回购凭证。
我在链接到这些说明的这篇 SO 文章中找到了解决方法。 似乎在重新启动后运行$ ssh-add -D
将使 Git 尊重每个 repo 的 SSH 密钥。 但是随后的 macOS 重启又使问题再次出现。
所以......问题是,为什么 Git 会被固定到第一个 SSH 凭据在重新启动后使用,为什么清除 SSH 身份并使用$ ssh-add -D
修复问题重新启动后不必做解决方法吗?
使用IdentitiesOnly yes
和IdentityFile
小心地声称自己只是一个人。 也就是说,稍微更新您的部分:
Host business
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa
IdentitiesOnly yes
Then make sure you use the URL ssh://business/path/to/work-repo.git
for work repositories (or business:path/to/repo.git
if you like the short version), and ssh://personal/path/to/personal-repo.git
用于个人。
所以......问题是,为什么 Git 会被固定到重启后使用的第一个 SSH 凭据......
它不是,真的 - 这不是一个真正的 macOS 问题,它在任何 ssh 设置中都很普遍(尽管细节会因您是否以及如何使用 ssh-agent 而异;macOS 设置您以便所有新的终端 windows默认共享一个代理,这通常是您想要的)。 The trick to understanding this is to understand how ssh keys work: how ssh presents keys to the sites to which you wish to authenticate, and how GitHub uses these ssh keys.
首先,让我们定义一个 ssh 密钥。 这是:
通常,您将私钥对自己保密并提供公钥,或者用私钥加密的东西,或者用两个密钥加密的东西,或者其他什么:细节并不是非常重要。 我们知道(并且关心)的是公钥会被给出,而私钥不会,我们可以假装你提供给其他 web 站点的“密钥”(例如github.com
)公钥。
现在,仅仅提供钥匙本身并不能证明你就是你。 有人可能在较早的交易中偷偷复制了您的公钥。 因此,GitHub(或您要连接的任何人)将向您发送一些加密的随机数据,只有在您拥有私钥时才能解密。 您解密它,从而向 GitHub 证明您不仅拥有您发送给他们的公钥,而且您是相应私钥的持有者。
GitHub,那么,考虑到这两件事,现在知道你就是你声称的那个人。 但你声称自己是谁? 为什么,谁拥有那个公钥,那就是谁。
所以,假设你有两个键,它们都可以工作。 今天,您首先提供公钥A。 他们向您发送了一个挑战,以测试您是否真的是A的私人一半的持有者,并且您的响应正确。 好吧,这就解决了:你是A 。
明天,你打电话给他们并首先出示公钥B。 他们给你一个挑战,你做出正确的回应,这就解决了。 你是B。
你是你第一次提供的人。 所以你这个人,就GitHub而言,就是你第一次自称的那个人。
但是假设在星期六(如果明天是星期五)您提供公钥A但未能发送正确的响应,则提供公钥B并发送正确的响应。 GitHub 现在会认为你是B 。
所以 GitHub真的相信你就是你成功声称的那个人。 这意味着即使你总是先提供A ,撤销A的私钥也足以让你成为B。 这或多或少是您的ssh-add -D
所做的。 (您的 ssh 可以很聪明,如果它没有正确的私钥,甚至不提供公钥,因为如果您打算在挑战中失败,那么声称自己是A毫无意义。当然,任何一种方式都有效,但总体而言,最好不要用一百万次按键尝试过多地敲门:人或正确编程的计算机会产生怀疑。)
最后,这意味着您必须首先确保 Git没有提供错误的密钥。 使用代理时,您可以添加任意数量的密钥,ssh 将能够“看到”所有这些密钥。 它将以某种顺序提供所有有效的密钥对,除非您使用IdentitiesOnly yes
。 如果您确实使用此行,它将仅提供具有IdentityFile
行和/或-i
选项的键。 (请注意,您可以列出多个文件,并且 ssh 仍会尝试多个键,无论顺序如何。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.