代码之家  ›  专栏  ›  技术社区  ›  radesix

多个github帐户和ssh配置

  •  231
  • radesix  · 技术社区  · 15 年前

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

    从一个帐户使用 git@github.com:accountname

    可从另一个帐户使用 git@github.com:anotheraccount

    每个帐户都有自己的ssh密钥。两个ssh密钥都已添加,我已经创建了一个配置文件。不过,我不相信配置文件是正确的。我不太确定如何指定使用 git@github.com:帐户名 应该使用 id_rsa git@github.com:另一个帐户 应该使用 id_rsa_anotheraccount .

    11 回复  |  直到 6 年前
        1
  •  293
  •   Community Mohan Dere    8 年前

    安迪·莱斯特的回答是准确的,但我发现了一个重要的额外步骤,我需要做才能使这一点发挥作用。在尝试设置两个配置文件时,一个用于个人,一个用于工作,我的 ~/.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://stackoverflow.com/a/17695338/1760313

        2
  •  159
  •   stefano    12 年前

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


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

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


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

    # 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添加
    你可能需要也可能不需要这样做。要进行检查,请通过运行列出身份指纹:

    $ 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)。但现在你该走了!:)

        3
  •  39
  •   AliciaBytes    10 年前

    让我们说 alice 是github.com用户,具有2个或更多私有存储库 repoN . 对于这个例子,我们将只使用两个名为 repo1 repo2

    https://github.com/alice/repo1

    https://github.com/alice/repo2

    您需要在不输入密码的情况下从这些存储库中提取,可能是在服务器上,也可能是在多个服务器上。 你想表演 git pull origin master 例如,您希望在不要求密码的情况下发生这种情况。

    你不喜欢和ssh代理打交道,你发现了 ~/.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 文件和您修改了远程服务器的URL origin 像这样:

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

    最后你去了仓库 Settings > Deploy keys 并添加了 alice_github.id_rsa.pub

    在这一点上,你可以做你的 Git拉原点主控形状

    所以你的直觉就是抓住那把钥匙并把它添加到 RePO2

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

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

    现在您将打开新的公钥 RePO2 在github.com上部署密钥配置,但现在您有一个ssh问题需要处理。

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

    你的 .ssh/config 文件指向 吉特布尔 它不知道什么时候该用哪把钥匙拉。

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

    所以第一件事就是编辑 git/CONFIG 您的repo克隆上的文件,因此它们看起来像这样:

    对于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拉原点主控形状 不输入两个存储库中的任何密码。

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

        4
  •  19
  •   drakonoved Andreas Petersson    6 年前

    我在Github上有两个账户,这是我在 linux )让它发挥作用。

    钥匙

    • 创建2对RSA密钥,通过 ssh-keygen 正确命名它们,使生活更轻松。
    • 通过向本地代理添加私钥 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:

    • 对于主机中的repo github-kc :

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

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

    解释

    选项在 ~/.ssh/config :

    • Host Github—识别特定用户
      主机可以是任何可以标识主机和帐户的值, 它不需要成为真正的主人, 例如 吉图布 确定我在Github上的一个本地帐户 笔记本电脑,

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


    • [以下是的子选项 宿主 ]
    • Hostname
      指定实际主机名,只需使用 github.com 为吉瑟布,
    • User 吉特
      用户总是 git 为吉瑟布,
    • IdentityFile
      指定要使用的密钥,只需将路径设置为公钥,
    • LogLevel
      指定要调试的日志级别(如果有问题)。 DEBUG3 提供最详细的信息。

        5
  •  17
  •   Yuval Adam    14 年前

    使用 IdentityFile 您的 ~/.ssh/config :

    Host github.com
        HostName github.com
        IdentityFile ~/.ssh/github.rsa
        User petdance
    
        6
  •  2
  •   berniey    8 年前

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

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

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

    2. 上传 keyfile.pub 到Git提供商

    3. 在您的计算机上启动ssh代理(您可以使用 ps -ef | grep ssh-agent 看看它是否已经在运行)
    4. ssh-add .\keyfile 添加凭据
    5. 现在你可以跑了 git clone git@provider:username/project.git
        7
  •  2
  •   drakonoved Andreas Petersson    6 年前

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

    1. 使用创建新标识文件 ssh-keygen -t rsa . 给它一个像 proj1.id_rsa 毫无疑问,因为你不需要密码。
    2. 在中添加新分区 .ssh/config :

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

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

    1. 将标识添加到ssh代理 ssh-add ~/.ssh/proj1.id_rsa
    2. 这是我第一次搞砸的-现在当你想克隆一个Proj1报告时,你可以用 项目1.github.com (配置文件中的主机)。 git clone git@proj1.github.com .

    A good tutorial.

    别跟主人搞混了

        8
  •  1
  •   Jyoti Prakash    12 年前

    我用过,

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

    它很好。

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

        9
  •  1
  •   Weiyi    10 年前

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

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

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

        10
  •  1
  •   David Hoerl    9 年前

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

    # 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 "dhoerl@xyz.com"
    git config --global github.user "dhoerl"        
    # git config --global github.token "whatever_it_is" # now unused
    
    ssh-add -D
    

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

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

    #! /bin/ksh
    if [ "$(git config --global --get user.email)" != "dhoerl@<company>.com" ]
    then
        exit 1
    fi
    
        11
  •  1
  •   Jakub Kukul    6 年前

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

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

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

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

    ssh-add ~/.ssh/id_rsa_anotheraccount
    

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

    还应该可以使用global git config和条件include将这种方法扩展到多个存储库中。( see example )