多个GitHub帐户和SSH配置


249

我很难让两个不同的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/…–
jgreen

我在〜/ .ssh / config中有3个单独的SSH身份。一个用于学校服务器的密码。单独的工作/个人GitHub权限的2没有。git pull尽管存在单独的身份文件,“ IdentitiesOnly = yes”,单独的域和主机名,但是运行始终失败,并要求学校提供密码,ssh-add -l无论设置如何,uni键都是“ first”。不得不将其部分移至.ssh / config中的其他部分之下,现在git pull从两个GitHub accts都成功了,并且没有要求uni ssh密码。
mc01

Answers:


309

安迪·莱斯特(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


39
谢谢!-那ssh-add是我所缺少的。
圣人

通过使用ssh-add,我可以看到我没有正确设置密钥的文件权限。一旦我修复一切正常。那谢谢啦!
phatmann

6
另请参见doblock.com/articles/…。关键的新信息是,您可能需要将用户名(在此示例中为“ work”)添加到远程URL中的主机名,即git@work.github.com:work / my_repo.git(如反对“ git@github.com ...”)
BobS 2012年


15
要解决“它们默认为第一个公共密钥”的问题,请添加IdentitiesOnly yes到文件Host *部分~/.ssh/config。这告诉ssh实际使用您指定的IdentityFiles,而不是将所有文件都发送给服务器。
机械蜗牛

172

最近,我不得不这样做,并且不得不仔细筛查所有这些答案及其评论以最终将信息拼凑起来,因此为了方便起见,我将所有这些信息放在一篇文章中:


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

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


步骤2:ssh config
通过创建/修改〜/ .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)。但是,现在您应该很好!:)


1
这是一个很好的回应。我不得不使用ssh-add来添加两个ssh密钥以利用配置文件。。谢谢:)
gaurav.singharoy

我唯一要添加的是运行ssh-keygen -t rsa时,它将为您提供一个默认文件名,即在其中输入自定义文件名的位置。
多纳托

最佳答案之一。这个视频也帮助了我。youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be
TestingWithArif

好后,将是很好,如果包含设置你的混帐配置“电子邮件”这个帖子: help.github.com/articles/...
戴夫工程师

43

假设alice是一个github.com用户,具有2个或更多私有存储库repoN。在此示例中,我们将仅使用两个名为repo1和的存储库repo2

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文件,并将遥控器的url修改为origin如下所示:

[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)

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

如果存储库托管在同一github.com域中,那么ssh如何分辨要使用哪个密钥?

您的.ssh/config文件指向,github.com并且不知道在进行提取时要使用哪个键。

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

因此,第一件事是编辑仓库中的.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个密钥。您将拥有更多要处理的密钥,但是如果密钥被泄露,您将不那么容易受到攻击。


1
指定与主机匹配的子域.ssh/config是关键步骤-非常感谢
Mike Miller

22

我在github上有2个帐户,这是我在上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

设置回购的远程URL:

  • 对于主机中的回购github-kc

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

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

讲解

中的选项~/.ssh/config

  • Hostgithub- <identify_specific_user>
    主机可以是任何可以识别主机加上帐户的值,它不必是真实的主机,例如 github-kc,在github上为我的本地笔记本电脑标识我的一个帐户,

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


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


可爱-不需要ssh-add path_to_private_key-可能是因为在这种情况下不需要代理。配置文件显式定义了键的路径。
Mark Chackerian's

2
@MarkChackerian我认为您不需要,ssh-add因为您的密钥不受密码保护,或者(如果您使用的是Mac,则)OSX密钥链正在为您处理。ssh-add防止您每次访问密钥时都需要输入密码。
Ashhar Hasan

18

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

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

谢谢,但是不太准确。我找到了答案并在下面分享。
radesix

我敢肯定,我的方法将对您有用。您可以标识不同的用户和不同的标识文件。只需在配置节中为每个主机赋予不同的Host参数。
安迪·莱斯特

1
安迪,根据我在下面找到的链接,我需要从主机上删除.com。一旦我这样做,它就可以正常工作。
radesix 2010年

5

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

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

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

并确保通过运行以下命令将您的密钥添加到ssh-agent中:

ssh-add ~/.ssh/id_rsa_anotheraccount

请记住,上面的命令只会将密钥添加到当前会话的ssh-agent中。如果您希望此操作永久有效,则必须“永久”将其添加到ssh-agent中。例如,这里是针对ubuntu的方法,这里是OSX的方法

还应该有可能使用全局git config和条件包含将这种方法扩展到多个存储库(请参阅示例)。


4

我花了很多时间来了解所有步骤。因此,让我们逐步描述:

  1. 使用创建新的身份文件ssh-keygen -t rsaproj1.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

一个很好的教程。

不要搞乱主机


感谢您与turorial的链接!你有一个错字:键名id_rsa_proj1proj1_id_rsa实际上应该是一样的。您也可以将本.git/config教程中有关设置的部分添加到答案中。
cezar '18

您仍然有错别字:proj1.id_rsavs.proj1_id_rsa
cezar,

3

就我而言,上述解决方案都不能解决我的问题,但是ssh-agent可以解决。基本上,我做了以下事情:

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

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

  2. 上载到keyfile.pubgit提供者

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

2

我用了,

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

很好。

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


2

作为@stefano答案的补充,-f在为另一个帐户生成新的SSH密钥时,最好与command配合使用,

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

由于id_rsa_workpath中不存在~/.ssh/该文件,因此我手动创建了该文件,并且它不起作用:(


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.