多个GitHub帐户和SSHconfiguration

我遇到了一些麻烦,让两个不同的SSH密钥/ GitHub帐户一起玩。 我有以下设置:

使用git@github.com:accountname可从一个帐户访问Repos

Repos使用git@github.com:anotheraccount从另一个帐户访问

每个帐户都有自己的SSH密钥。 两个SSH密钥都被添加了,我创build了一个configuration文件。 我不相信configuration文件是正确的。 我不太清楚如何指定使用git@github.com:accountname访问repos git@github.com:accountname应该使用id_rsagit@github.com:anotheraccount应该使用id_rsa_anotheraccount

安迪·莱斯特的回答是准确的,但是我发现了一个重要的额外步骤,我需要使这个工作。 在试图build立两个configuration文件,一个为个人和一个为工作,我~/.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 

我的工作configuration文件没有采取,直到我做了一个ssh-add ~/.ssh/work_rsa 。 之后,连接到github使用正确的configuration文件。 以前,他们默认第一个公钥。

对于使用ssh-add无法打开与身份validation代理的连接
检查: https : //stackoverflow.com/a/17695338/1760313

我最近不得不这样做,不得不对所有这些答案和他们的意见进行筛选,最终把这些信息拼凑在一起,所以为了您的方便,我将把它放在一个post里。

第1步:SSH密钥
创build您需要的任何密钥对。 在这个例子中,我已经命名为默认/原始'id_rsa'(这是默认值)和我的新'id_rsa-work':

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

第2步:sshconfiguration
通过创build/修改〜/ .ssh / config来设置多个sshconfiguration文件。 请注意略有不同的“主机”值:

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

如果您的input不在那里然后运行:

 ssh-add ~/.ssh/id_rsa_work 

第四步:testing
为了testing你做的这一切都正确,我build议以下快速检查:

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

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

https://github.com/alice/repo1

https://github.com/alice/repo2

您需要从这些存储库中提取数据,而不必在服务器或多台服务器上input密码。 例如,你想要执行git pull origin master ,而且你希望在不需要密码的情况下发生这种情况。

你不喜欢和ssh-agent打交道,你已经发现了(或者你正在发现) ~/.ssh/config一个文件,让你的ssh客户端根据主机名和用户名知道使用哪个私钥,简单的configuration条目看起来像这样:

 Host github.com HostName github.com User git IdentityFile /home/alice/.ssh/alice_github.id_rsa IdentitiesOnly yes 

所以你继续创build你的(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而不用input密码没有问题。

但是第二个存储库呢?

所以你的直觉就是抓住这个键并把它添加到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.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)

现在你将在github.com上把新的公钥放在repo2的部署密钥configuration上,但是现在你有一个ssh问题需要处理。

如果仓库托pipe在同一个github.com域,ssh如何能告诉哪个关键?

你的.ssh/config文件指向github.com ,它不知道在执行pull时使用哪个键。

所以我find了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文件中,现在你将能够input每个子域的configuration:)

 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 

现在,您可以在不input任何密码的情况下将git pull origin master出来。

如果你有多台机器,你可以将密钥复制到每台机器上,然后重新使用它们,但是我build议你做好每台机器和每台机器生成1个密钥的工作。 你将会有更多的钥匙可以处理,但是如果一个人受到威胁,你的脆弱性就会降低。

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

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

我在github上有两个帐户,这是我做的(在linux )使其工作。

按键

  • 创build2对RSA密钥,通过ssh-keygen ,正确命名它们,使生活更轻松。
  • 通过ssh-add path_to_private_key将私钥添加到本地代理
  • 对于每个github账户,上传一个(不同的)公钥。

组态

的〜/ .ssh /configuration

  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- <identify_specific_user>
    主机可以是任何可以识别主机加上帐户的值,它不需要成为真正的主机,例如github-kc在我的本地笔记本电脑上在github上标识我的帐户之一,

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

  • [以下是Host子选项]
  • Hostname
    指定实际的主机名,只需使用github.com作为github,
  • User git
    用户总是git的github,
  • IdentityFile
    指定要使用的密钥,只需将path设置为公钥,
  • LogLevel
    指定日志级别进行debugging,如果有任何问题, DEBUG3给出了最详细的信息。

在我的情况下,上述解决scheme都没有解决我的问题,但ssh代理。 基本上,我做了以下几点:

  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

我用了,

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

它被罚款。

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

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

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

由于id_rsa_work文件不存在于path~/.ssh/ ,我手动创build这个文件,并且它不工作:(

我使用shell脚本将我切换到任何我想要“活跃”的帐户。 本质上,你从一个新的开始,让一个帐户configuration正确,工作,然后将这些文件移动到一个正确的前缀名称。 从此,您可以使用命令“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中创build了一个运行脚本(对于你的Mac用户),所以除非我有适当的设置(因为它使用git),否则不会构build我的项目:

运行放置在依赖关系之后的脚本:

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

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

  1. 使用ssh-keygen -t rsa创build新的身份文件。 给它一个像proj1.id_rsa的替代品,毫无疑问,因为你不需要密码。
  2. .ssh/config添加新的部分:

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

考虑到第一部分,并注意proj1.github.com我们将回到后面的部分。

  1. 将身份添加到ssh代理ssh-add ~/.ssh/proj1_id_rsa
  2. 这是我第一次proj1.github.com了 – 现在当你想克隆一个proj1回购你使用proj1.github.com (确切地说是主机从configuration文件)。 git clone git@proj1.github.com

一个很好的教程。

不要搞乱主机