多个 GitHub 帐户和 SSH 配置

Posted

技术标签:

【中文标题】多个 GitHub 帐户和 SSH 配置【英文标题】:Multiple GitHub Accounts & SSH Config 【发布时间】:2011-03-14 15:25:04 【问题描述】:

我在让两个不同的 SSH 密钥/GitHub 帐户配合使用时遇到了一些问题。我有以下设置:

使用git@github.com:accountname从一个帐户访问回购

使用 git@github.com:anotheraccount 可从另一个帐户访问存储库

每个帐户都有自己的 SSH 密钥。两个 SSH 密钥都已添加,并且我创建了一个配置文件。我不相信配置文件是正确的。我不太确定如何指定使用git@github.com:accountname 访问的存储库应该使用id_rsagit@github.com:anotheraccount 应该使用id_rsa_anotheraccount

【问题讨论】:

我发现这个链接很有帮助medium.freecodecamp.org/… 我在 ~/.ssh/config 中有 3 个单独的 SSH 身份。用于学校服务器的有密码;用于单独工作/个人 GitHub 帐户的 2 没有。运行git pull 一直失败并要求输入学校密码,尽管有单独的身份文件、“IdentitiesOnly=yes”、单独的域和主机名,都存在于ssh-add -l 中……无论设置如何,uni 密钥都是“第一”。必须将其部分移到 .ssh/config 中的其他部分下方,现在来自两个 GitHub 帐户的 git pull 成功,无需询问 uni ssh 密码。 这里详细回答superuser.com/questions/232373/… 【参考方案1】:

编辑 ssh 配置文件的一种可能更简单的替代方法(如所有其他答案中所建议的)是将单个存储库配置为使用不同的(例如非默认)ssh 密钥。

在要使用不同密钥的存储库中,运行:

git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount'

如果您的密钥受密码保护并且您不想每次都输入密码,则必须将其添加到 ssh-agent。以下是ubuntu 和macOS 的操作方法。

还应该可以使用全局 git config 和条件包含 (see example) 将此方法扩展到多个存储库。

【讨论】:

【参考方案2】:

按照这些步骤来解决这个问题,它看起来太长了,但相信我不会超过 5 分钟:

第 1 步:创建两个 ssh 密钥对:

ssh-keygen -t rsa -C "your_email@youremail.com"

第 2 步:它将在此处创建两个 ssh 密钥:

~/.ssh/id_rsa_account1
~/.ssh/id_rsa_account2

第 3 步:现在我们需要添加这些键:

ssh-add ~/.ssh/id_rsa_account2
ssh-add ~/.ssh/id_rsa_account1
您可以使用以下命令查看添加的密钥列表:ssh-add -l 您可以通过以下命令删除旧的缓存键:ssh-add -D

第四步:修改 ssh 配置

cd ~/.ssh/
touch config

subl -a configcode confignano config

第 5 步:将其添加到配置文件:

#Github account1
Host github.com-account1
    HostName github.com
    User account1
    IdentityFile ~/.ssh/id_rsa_account1

#Github account2
Host github.com-account2
    HostName github.com
    User account2
    IdentityFile ~/.ssh/id_rsa_account2

第 6 步:更新您的 .git/config 文件:

步骤 6.1:导航到 account1 的项目并更新主机:

[remote "origin"]
        url = git@github.com-account1:account1/gfs.git

如果您在他们的 git 存储库中受到其他用户的邀请。 然后你需要像这样更新主机:

[remote "origin"]
            url = git@github.com-account1:invitedByUserName/gfs.git

步骤 6.2:导航到 account2 的项目并更新主机:

[remote "origin"]
        url = git@github.com-account2:account2/gfs.git

步骤 7:如果需要,单独更新每个存储库的用户名和电子邮件,这不是修正步骤:

导航到 account1 项目并运行这些:

git config user.name "account1"
git config user.email "account1@domain.com" 

导航到 account2 项目并运行这些:

git config user.name "account2"
git config user.email "acccount2@doamin.com" 

【讨论】:

是否有任何关于将-account1 附加到 github 域的文档?经过测试,它确实有效,但它让我感到惊讶,因为我在任何地方都没有读到它。【参考方案3】:

我发布了我用来处理这些here的技术

【讨论】:

【参考方案4】:

我花了很多时间来了解所有步骤。所以让我们一步一步描述:

    使用ssh-keygen -t rsa 创建新的身份文件。给它一个替代方案,例如 proj1.id_rsa,然后毫无疑问地点击它,因为您不需要密码。

    .ssh/config中添加新部分:

    Host proj1.github.com
        HostName github.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/proj1.id_rsa
    

考虑第一部分并注意proj1.github.com我们稍后会回到该部分。

    将身份添加到 ssh 代理 ssh-add ~/.ssh/proj1.id_rsa 这是我第一次搞砸的——现在,当你想克隆一个 proj1 存储库时,你可以使用 proj1.github.com(确切地说是配置文件中的主机)。 git clone git@proj1.github.com

A good tutorial.

别惹宿主

【讨论】:

感谢教程的链接!您有一个错字:键名 id_rsa_proj1proj1_id_rsa 实际上应该相同。您还可以将教程中有关.git/config 设置的部分添加到您的答案中。 你还有一个错字:proj1.id_rsa vs. proj1_id_rsa【参考方案5】:

我在 github 上有 2 个帐户,这是我所做的(在 linux 上)以使其正常工作。

按键

通过ssh-keygen 创建 2 对 rsa 密钥,正确命名它们,让生活更轻松。 通过ssh-add path_to_private_key将私钥添加到本地代理 为每个 github 帐户上传一个(不同的)公钥。

配置

~/.ssh/config

Host github-kc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_kc.pub
    # LogLevel DEBUG3

Host github-abc
    Hostname        github.com
    User git
    IdentityFile    ~/.ssh/github_rsa_abc.pub
    # LogLevel DEBUG3

为 repo 设置远程 url:

对于主机github-kc中的repo:

git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git

对于主机github-abc中的repo:

git remote set-url origin git@github-abc:abcdefg/yyy.git

说明

~/.ssh/config 中的选项:

Hostgithub- 主机可以是任何可以识别主机和帐户的值, 它不需要是一个真正的主机, 例如 github-kc 在 github 上为我的本地识别我的一个帐户 笔记本电脑,

当为 git repo 设置远程 url 时,这是放在 git@ 之后的值,这就是 repo 映射到主机的方式,例如 git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git

[以下是Host的子选项] Hostname 指定实际主机名,github 使用github.comUsergit 对于 github,用户始终为 gitIdentityFile 指定要使用的密钥,只需将路径放入公钥, LogLevel 指定要调试的日志级别,如果有任何问题,DEBUG3 会提供最详细的信息。

【讨论】:

可爱——不需要ssh-add path_to_private_key——可能是因为在这种情况下不需要代理。配置文件明确定义了键的路径。 @MarkChackerian 我认为您不需要ssh-add,因为您的密钥不受密码保护,或者(如果您在 Mac 上)OSX 钥匙串正在为您处理它。 ssh-add 使您无需在每次访问密钥时都输入密码。 太棒了,我要找的东西。谢谢【参考方案6】:

在我的情况下,上述解决方案都没有解决我的问题,但 ssh-agent 可以。基本上,我做了以下事情:

    使用如下所示的 ssh-keygen 生成密钥对。它将生成一个密钥对(在此示例中为 .\keyfile.\keyfile.pub

    ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile

    上传keyfile.pub到git提供者

    在您的机器上启动 ssh-agent(您可以通过 ps -ef | grep ssh-agent 检查它是否已经在运行) 运行ssh-add .\keyfile 以添加凭据 现在你可以运行git clone git@provider:username/project.git

【讨论】:

【参考方案7】:

Andy Lester 的回答是准确的,但我发现我需要采取一个重要的额外步骤才能使其正常工作。在尝试设置两个配置文件时,一个用于个人,一个用于工作,我的~/.ssh/config 大致如下:

Host me.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/me_rsa

Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/work_rsa

直到我做了ssh-add ~/.ssh/work_rsa,我的工作资料才被录用。之后与 github 的连接使用了正确的配置文件。以前他们默认使用第一个公钥。

对于在使用ssh-add 时无法打开与您的身份验证代理的连接,请检查: https://***.com/a/17695338/1760313

【讨论】:

谢谢! - ssh-add 是我所缺少的。 通过使用 ssh-add,我可以看到我没有正确设置密钥的文件权限。一旦我修复了一切正常。所以谢谢! 另见doblock.com/articles/…。关键的新信息是您可能需要将用户名(在本例中为“work”)添加到远程 URL 中的主机名,即 git@work.github.com:work/my_repo.git(如反对“git@github.com...”) 这工作:superuser.com/questions/232373/… 要解决“他们默认使用第一个公钥”的问题,请将IdentitiesOnly yes 添加到您的~/.ssh/config 文件的Host * 部分。这告诉 ssh 实际使用您指定的 IdentityFiles,而不是向服务器发送垃圾邮件。【参考方案8】:

假设 alice 是 github.com 用户,拥有 2 个或更多私有存储库 repoN。 对于这个示例,我们将只使用两个名为 repo1repo2 的存储库

https://github.com/alice/repo1

https://github.com/alice/repo2

您需要在不输入密码的情况下从这些存储库中提取,可能是在一台服务器或多台服务器上。 例如,您想要执行git pull origin master,并且您希望在不要求输入密码的情况下执行此操作。

您不喜欢与 ssh-agent 打交道,您已经发现(或者您现在正在发现)~/.ssh/config 一个文件,它可以让您的 ssh 客户端根据主机名和用户名知道要使用的私钥,并带有如下所示的简单配置条目:

Host github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/alice_github.id_rsa
  IdentitiesOnly yes

因此,您继续创建了您的 (alice_github.id_rsa, alice_github.id_rsa.pub) 密钥对,然后您还转到了存储库的 .git/config 文件,并将远程 origin 的 URL 修改为如下所示:

[remote "origin"]
        url = "ssh://git@github.com/alice/repo1.git"

最后你去了存储库Settings > Deploy keys部分并添加了alice_github.id_rsa.pub的内容

此时,您可以在不输入密码的情况下执行git pull origin master,而不会出现问题。

但是第二个存储库呢?

因此,您的直觉是获取该密钥并将其添加到 repo2 的 Deploy 密钥中,但 github.com 会出错并告诉您该密钥已被使用。

现在你去生成另一个密钥(当然使用ssh-keygen -t rsa -C "alice@alice.com" 没有密码),为了不让这变得一团糟,你现在将这样命名你的密钥:

repo1 密钥对:(repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub) repo2 密钥对:(repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

您现在将新的公钥放在 github.com 上的 repo2 的 Deploy keys 配置中,但现在您需要处理 ssh 问题。

如果存储库托管在同一个 github.com 域上,ssh 如何判断使用哪个密钥?

您的 .ssh/config 文件指向 github.com,但它不知道在进行拉取时使用哪个键。

所以我在 github.com 上找到了一个窍门。您可以告诉您的 ssh 客户端,每个存储库位于不同的 github.com 子域中,在这些情况下,它们将是 repo1.github.comrepo2.github.com

所以首先是在你的 repo 克隆上编辑 .git/config 文件,所以它们看起来像这样:

对于 repo1

[remote "origin"]
        url = "ssh://git@repo1.github.com/alice/repo1.git"

对于 repo2

[remote "origin"]
        url = "ssh://git@repo2.github.com/alice/repo2.git"

然后,在您的.ssh/config 文件中,现在您将能够为每个子域输入配置:)

Host repo1.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
  IdentitiesOnly yes

Host repo2.github.com
  HostName github.com
  User git
  IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
  IdentitiesOnly yes

现在您无需从两个存储库中输入任何密码即可git pull origin master

如果您有多台机器,您可以将密钥复制到每台机器并重复使用它们,但我建议您做一些工作以在每台机器和存储库中生成 1 个密钥。您将有更多的密钥需要处理,但如果其中一个被泄露,您将不会那么容易受到攻击。

【讨论】:

指定与.ssh/config 中的主机匹配的子域是关键步骤 - 非常感谢 很好地解释了Host 组件,谢谢【参考方案9】:

作为@stefano 回答的补充, 为另一个帐户生成新的 SSH 密钥时,最好使用带有-f 的命令,

ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "your@mail.com"

由于路径~/.ssh/ 中不存在id_rsa_work 文件,我手动创建此文件,但它不起作用:(

【讨论】:

【参考方案10】:

我用过,

Host github.com
   HostName github.com
   IdentityFile ~/.ssh/github_rsa
   User abc@gmail.com

一切正常。

在您的 .ssh/config 文件中为不同的用户名使用不同的 rsa 密钥。

【讨论】:

【参考方案11】:

我最近不得不这样做,并且必须筛选所有这些答案和他们的 cmets 以最终将信息拼凑在一起,所以为了您的方便,我将把它们都放在一个帖子中:

第 1 步:ssh 密钥 创建您需要的任何密钥对。在此示例中,我将我命名为默认/原始“id_rsa”(这是默认值)和我的新名称“id_rsa-work”:

ssh-keygen -t rsa -C "stefano@work.com"

第 2 步:ssh 配置 通过创建/修改 ~/.ssh/config 设置多个 ssh 配置文件。请注意略有不同的“主机”值:

# Default GitHub
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa

# Work GitHub
Host work.github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_work

第 3 步:ssh-add 您可能需要也可能不需要这样做。要检查,请通过运行列出身份指纹:

$ ssh-add -l
2048 1f:1a:b8:69:cd:e3:ee:68:e1:c4:da:d8:96:7c:d0:6f stefano (RSA)
2048 6d:65:b9:3b:ff:9c:5a:54:1c:2f:6a:f7:44:03:84:3f stefano@work.com (RSA)

如果您的条目不存在,则运行:

ssh-add ~/.ssh/id_rsa_work

第 4 步:测试 为了测试您是否正确完成了这一切,我建议您进行以下快速检查:

$ ssh -T git@github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T git@work.github.com
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

请注意,您必须根据要使用的密钥/身份更改主机名 (github / work.github)。但现在你应该好好去! :)

【讨论】:

这是一个很好的回应。我必须使用 ssh-add 添加两个 ssh 密钥才能使用配置文件。谢谢 :) 我唯一想补充的是,当你运行 ssh-keygen -t rsa 时,它会给你一个默认的文件名,即你输入自定义文件名的地方。 最佳答案之一。这个视频也帮助了我。 youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be 好帖子,如果这篇帖子包含设置你的 git config 'email' 就好了:help.github.com/articles/… 如果其他人在执行“ssh-agent”时遇到“连接代理错误”,请查看***.com/questions/52113738/…【参考方案12】:

~/.ssh/config 中使用IdentityFile 参数:

Host github.com
    HostName github.com
    IdentityFile ~/.ssh/github.rsa
    User petdance

【讨论】:

谢谢,但这不是很准确。我找到了答案并在下面分享。 我很确定我的方法适用于您的情况。您可以识别不同的用户和不同的身份文件。只需要在配置节上给每个不同的 Host 参数。 安迪,根据我在下面找到的链接,我需要从主机中删除 .com。一旦我这样做了,它就可以正常工作了。

以上是关于多个 GitHub 帐户和 SSH 配置的主要内容,如果未能解决你的问题,请参考以下文章

为不同的 GitHub 帐户使用多个 SSH 密钥

多个github帐户错误

Git配置多个SSH-Key(在一台电脑上,如何配置多个SSH Key?/多个用户身份)

text 不同github帐户的多个SSH密钥设置

markdown 用于不同github帐户的多个SSH密钥

markdown 用于不同github帐户的多个SSH密钥