繁体   English   中英

Git 多个 SSH macos 设置卡在一个帐户上

[英]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修复问题重新启动后不必做解决方法吗?

TL;博士

使用IdentitiesOnly yesIdentityFile小心地声称自己只是一个人。 也就是说,稍微更新您的部分:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM