【问题标题】:Multiple GitHub Accounts & SSH Config多个 GitHub 帐户和 SSH 配置
【发布时间】: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 密码。

标签: ssh github ssh-keys


【解决方案1】:

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

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

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

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

还应该可以使用全局 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】:

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

      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 存储库时,你可以使用 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.com
      • Usergit
        对于 github,用户始终为 git
      • IdentityFile
        指定要使用的密钥,只需将路径放入公钥,
      • LogLevel
        指定要调试的日志级别,如果有任何问题,DEBUG3 会提供最详细的信息。

      【讨论】:

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

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

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

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

      2. 上传keyfile.pub到git提供者

      3. 在您的机器上启动 ssh-agent(您可以通过 ps -ef | grep ssh-agent 检查它是否已经在运行)
      4. 运行ssh-add .\keyfile 以添加凭据
      5. 现在你可以运行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://stackoverflow.com/a/17695338/1760313

        【讨论】:

        • 谢谢! - ssh-add 是我所缺少的。
        • 通过使用 ssh-add,我可以看到我没有正确设置密钥的文件权限。一旦我修复了一切正常。所以谢谢!
        • 另见doblock.com/articles/…。关键的新信息是您可能需要将用户名(在本例中为“work”)添加到远程 URL 中的主机名,即 git@work.github.com:work/my_repo.git(如反对“git@github.com...”)
        • 要解决“他们默认使用第一个公钥”的问题,请将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”时遇到“连接代理错误”,请查看stackoverflow.com/questions/52113738/…
            【解决方案12】:

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

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

            【讨论】:

            • 谢谢,但这不是很准确。我找到了答案并在下面分享。
            • 我很确定我的方法适用于您的情况。您可以识别不同的用户和不同的身份文件。只需要在配置节上给每个不同的 Host 参数。
            • 安迪,根据我在下面找到的链接,我需要从主机中删除 .com。一旦我这样做了,它就可以正常工作了。
            猜你喜欢
            • 1970-01-01
            • 2020-02-18
            • 1970-01-01
            • 1970-01-01
            • 2015-06-28
            • 1970-01-01
            • 2021-02-19
            相关资源
            最近更新 更多