多个GitHub账户&

Multiple GitHub Accounts & SSH Config

我很难让两个不同的ssh密钥/github帐户一起玩得很好。我有以下设置:

使用[email protected]:accountname从一个账户获得回购

使用[email protected]:anotheraccount从另一个账户获得的回购

每个帐户都有自己的ssh密钥。两个ssh密钥都已添加,我已经创建了一个配置文件。不过,我不相信配置文件是正确的。我不太确定如何指定使用[email protected]:accountname访问的repos应该使用id_rsa[email protected]:anotheraccount应该使用id_rsa_anotheraccount


安迪·莱斯特的回答是准确的,但我发现了一个重要的额外步骤,我需要做才能使这一点发挥作用。在试图建立两个配置文件时,一个用于个人,一个用于工作,我的~/.ssh/config大致如下:

1
2
3
4
5
6
7
8
9
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://stackoverflow.com/a/17695338/1760313


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

步骤1:ssh密钥创建您需要的任何密钥对。在这个例子中,我将自己命名为默认/原始的"id_rsa"(这是默认值)和新的"id_rsa-work":

1
ssh-keygen -t rsa -C"[email protected]"

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

1
2
3
4
5
6
7
8
9
10
11
# 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添加你可能需要也可能不需要这样做。要进行检查,请通过运行列出身份指纹:

1
2
3
$ 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 [email protected] (RSA)

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

1
ssh-add ~/.ssh/id_rsa_work

步骤4:测试为了测试您是否正确完成了这些操作,我建议您进行以下快速检查:

1
2
3
4
5
$ ssh -T [email protected]
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T [email protected]
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

请注意,您必须根据要使用的密钥/标识更改主机名(github/work.github)。但现在你该走了!:)


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

https://github.com/alice/repo1

https://github.com/alice/repo2

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

您不喜欢与ssh代理打交道,您已经发现(或者现在正在发现)了~/.ssh/config的一个文件,它让您的ssh客户机知道根据主机名和用户名使用什么私钥,并使用一个简单的配置项,如下所示:

1
2
3
4
5
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修改为如下所示:

1
2
[remote"origin"]
        url ="ssh://[email protected]/alice/repo1.git"

最后,您转到存储库Settings > Deploy keys部分,添加了alice_github.id_rsa.pub的内容。

此时,您可以在不输入密码的情况下执行git pull origin master

但是第二个仓库呢?

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

现在,您开始生成另一个密钥(当然是使用不带密码的ssh-keygen -t rsa -C"[email protected]"),这样就不会变得一团糟,现在您可以这样命名您的密钥:

  • repo1键对:(repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
  • repo2键对:(repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

现在您将把新的公钥放在gethub.com上repo2的部署密钥配置上,但现在您有一个ssh问题需要处理。

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

你的.ssh/config文件指向github.com,但它不知道什么时候需要使用哪个密钥。

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

所以第一件事就是在你的repo克隆上编辑.git/config文件,所以它们看起来是这样的:

对于RePO1

1
2
[remote"origin"]
        url ="ssh://[email protected]/alice/repo1.git"

对于RePO2

1
2
[remote"origin"]
        url ="ssh://[email protected]/alice/repo2.git"

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

1
2
3
4
5
6
7
8
9
10
11
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

如果您有多台机器,您可以将密钥复制到每台机器上,然后重新使用它们,但是我建议您执行腿部工作,为每台机器和repo生成一个密钥。你将有更多的钥匙需要处理,但是如果有人受到威胁,你就不那么容易受到伤害。


我在Github上有两个账户,这是我(在linux上)为使它工作所做的。

钥匙

  • 通过ssh-keygen创建2对rsa密钥,正确命名它们,使其更容易使用。
  • 通过ssh-add path_to_private_key向本地代理添加私钥
  • 对于每个github帐户,上载一个(不同的)公钥。

配置

~/.ssh/CONFIG

1
2
3
4
5
6
7
8
9
10
11
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:

    1
    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
  • 对于主机github-abc中的repo:

    1
    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

  • < BR>
  • [以下是Host的子选项]
  • Hostname
    指定实际主机名,只需将github.com用于github,
  • Usergit
    对于github,用户始终是git
  • IdentityFile
    指定要使用的密钥,只需将路径设置为公钥,
  • LogLevel
    指定要调试的日志级别(如果有问题),DEBUG3提供最详细的信息。


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

1
2
3
4
Host github.com
    HostName github.com
    IdentityFile ~/.ssh/github.rsa
    User petdance


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

  • 使用ssh-keygen -t rsa创建新的标识文件。给它一个类似于proj1.id_rsa的选项,毫无疑问地点击,因为你不需要密码。
  • .ssh/config中增加新段:

    1
    2
    3
    4
    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 repo的时候,你就用proj1.github.com来克隆(配置文件中的主机)。git clone [email protected]
  • 一个好的教程。

    别把主人搞砸了


    在我的例子中,上面的解决方案都没有解决我的问题,但是ssh代理解决了。基本上,我做了以下工作:

  • 使用ssh keygen生成密钥对,如下所示。它将生成一个密钥对(在本例中为.\keyfile.\keyfile.pub)

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

  • 上传keyfile.pub至git提供商

  • 在您的机器上启动ssh代理(您可以与ps -ef | grep ssh-agent确认它是否已经在运行)
  • 运行ssh-add .\keyfile添加凭证
  • 现在你可以运行git clone git@provider:username/project.git

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

    在要使用其他密钥的存储库中,运行:

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

    并确保通过运行以下命令将密钥添加到ssh代理:

    1
    ssh-add ~/.ssh/id_rsa_anotheraccount

    请记住,上面的命令只会为当前会话向ssh代理添加密钥。如果你想让它永远工作,你必须"永久"地将它添加到你的ssh代理中。例如,这是如何为Ubuntu和OSX做的。

    还应该可以使用全局git配置和条件include将这种方法扩展到多个存储库(参见示例)。


    作为对@stefano答案的补充,在为另一个帐户生成新的ssh密钥时,最好将命令与-f一起使用。

    1
    ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C"[email protected]"

    由于id_rsa_work文件在路径~/.ssh/中不存在,我手工创建了这个文件,它不工作:(


    我用过,

    1
    2
    3
    4
    Host github.com
       HostName github.com
       IdentityFile ~/.ssh/github_rsa
       User [email protected]

    它很好。

    在.ssh/config文件中对不同用户名的不同rsa密钥使用上述设置。


    我使用shell脚本将我切换到我想要的"活动"帐户。基本上,您从新的开始,得到一个正确配置和工作的帐户,然后将这些文件移动到一个具有正确前缀的名称。从那时起,您可以使用命令"github"或"gitxyz"切换:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # my github script
    cd ~/.ssh
    rm id_rsa
    rm id_rsa.pub
    rm config

    ln git_dhoerl id_rsa
    ln git_dhoerl.pub id_rsa.pub
    ln config_dhoerl config

    git config --global user.email"[email protected]"
    git config --global github.user"dhoerl"        
    # git config --global github.token"whatever_it_is" # now unused

    ssh-add -D

    我在这方面运气很好。我还在Xcode中创建了一个运行脚本(对于Mac用户),这样它就不会构建我的项目,除非我有适当的设置(因为它使用了git):

    运行位于依赖项之后的脚本:

    1
    2
    3
    4
    5
    #! /bin/ksh
    if ["$(git config --global --get user.email)" !="dhoerl@<company>.com" ]
    then
        exit 1
    fi