我很难让两个不同的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没有。尽管单独的身份文件,“ IdentitiesOnly = yes”,单独的域和主机名都存在于ssh-add -l中,但运行git pull一直失败并要求学校提供密码,无论设置如何,uni键都是“ first” 。不得不将其部分移到.ssh / config中的其他部分之下,现在从两个GitHub accts的git pull都成功了,并且没有要求uni ssh密码。

在此处可以详细解答superuser.com/questions/232373/…

#1 楼

安迪·莱斯特(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是我所缺少的。

–圣人
2011-12-20 6:46

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

–phatmann
2012年1月13日15:55

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

– Bobs
2012年3月24日19:33

这有效:superuser.com/questions/232373/…

–卡西
2012年3月28日在21:16

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

–机械蜗牛
2012年5月9日7:18

#2 楼

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

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)。但是现在你应该很好走了! :)

评论


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

– gaurav.singharoy
2014年4月23日19:05

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

–多纳托
16-09-26在16:29

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

–TestingWithArif
18 Mar 4 '18 at 11:58

好的帖子,如果这篇帖子包括设置您的git config'email',那就太好了:help.github.com/articles/…

–戴维工程师
18/12/7在16:39



如果在执行“ ssh-agent”时其他人遇到“连接到代理时出错”,请查看stackoverflow.com/questions/52113738/…

– Uniquegino
2天前



#3 楼

假设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的网址修改为如下所示:

[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上的公共密钥,但是现在您需要处理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个密钥并重新存储。您将拥有更多要处理的密钥,但是如果密钥被盗用,您将不那么容易受到攻击。

评论


在.ssh / config中指定与主机匹配的子域是至关重要的步骤-非常感谢

–迈克·米勒(Mike Miller)
18年5月11日在10:57

#4 楼

我在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中的选项:




Host github-
主机可以是可以标识主机和帐户的任何值,
不必是真实的主机,
例如
github-kc可以识别一个主机我在github上的帐户的本地
笔记本电脑,

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


[以下是Host的子选项]

Hostname
指定实际的主机名,只需对github使用github.com

User git
用户对于github总是git

IdentityFile
指定要使用的密钥,只需将路径设置为公共密钥,

LogLevel
指定要调试的日志级别,如果有问题,DEBUG3提供最详细的信息。



评论


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

– Mark Chackerian
16年5月26日在22:05

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

–阿什哈尔·哈桑(Ashhar Hasan)
16-10-10在22:53

太好了,这就是我想要的。谢谢

–达瓦尔
2天前

#5 楼

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

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


评论


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

– radesix
2010年7月12日在4:36

我敢肯定,我的方法将对您有效。您可以标识不同的用户和不同的标识文件。只需在config节中为每个主机赋予不同的Host参数。

–安迪·莱斯特(Andy Lester)
10年7月12日在4:48

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

– radesix
2010年7月13日在14:30

#6 楼

编辑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和条件包含将这种方法扩展到多个存储库(请参见示例)。

#7 楼

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


使用ssh-keygen -t rsa创建新的身份文件。给它一个类似proj1.id_rsa的替代名称,因为不需要密码,因此毫无疑问会命中。

.ssh/config中添加新部分:

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



请考虑到第一部分,并注意我们稍后将返回该部分。


将身份添加到ssh代理proj1.github.com

那是我第一次弄错的-现在,当您想克隆proj1存储库时,可以使用ssh-add ~/.ssh/proj1.id_rsa(恰好是配置文件中的主机)来完成。
proj1.github.com

一个很好的教程。 br />
不要搞乱主机

评论


感谢您与turorial的链接!您有一个错字:键名id_rsa_proj1和proj1_id_rsa实际上应该相同。您也可以将本教程中有关.git / config设置的部分添加到答案中。

–cezar
18年2月2日在12:46

您仍然有错别字:proj1.id_rsa与proj1_id_rsa

–cezar
18年2月2日在14:50

#8 楼

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



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

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

keyfile.pub上载到git provider
在计算机上启动ssh-agent(您可以使用ps -ef | grep ssh-agent进行检查以查看其是否已经在运行)
运行ssh-add .\keyfile以添加凭据
现在您可以运行git clone git@provider:username/project.git



#9 楼

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

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


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

#10 楼

我用过,

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


很好用。

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

#11 楼

我在这里发布了用于处理这些问题的技术

#12 楼

请按照以下步骤操作,以解决它看起来太长的问题,但是请相信我,它不会花费超过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



步骤4:修改ssh config
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:更新每个存储库的用户名和电子邮件如果需要,请分别y,这不是一个修订步骤:
导航到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"