多个GitHub账户&SSH配置

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

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

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

每个帐号都有自己的SSH密钥。两个SSH密钥都已经添加,我已经创建了一个配置文件。我不相信配置文件是正确的。我不太确定如何指定使用git@github.com:accountname访问的回购应该使用id_rsa,而git@github.com:anotheraccount应该使用id_rsa_anotheraccount

134929 次浏览

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

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

安迪莱斯特的回答是准确的,但我发现我需要做一个重要的额外步骤来让它工作。在尝试设置两个配置文件时,一个用于个人,一个用于工作,我的~/.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 < / p >

我发布了我用来处理这些在这里的技巧

我最近不得不这么做,不得不筛选所有这些答案和他们的评论,最终把信息拼凑在一起,所以我把它们都放在这里,在一个帖子里,为了你的方便:

< p > < br > 步骤1:ssh密钥 < br > 创建任何你需要的键盘。在这个例子中,我将我的default/original命名为'id_rsa'(这是默认的),而我的新命名为'id_rsa-work':

ssh-keygen -t rsa -C "stefano@work.com"
< p > < br > 步骤2:ssh config < br > 通过创建/修改~ / . ssh / config设置多个ssh配置文件。注意'Host'值略有不同:

# 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
< p > < br > 步骤3:ssh-add < br > 你不一定要这么做。通过

列出身份指纹进行检查
$ 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
< p > < br > 第四步:测试 < br > 为了测试这些操作是否正确,我建议快速检查:

$ 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)。但是现在你应该可以出发了!:)

我使用,

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

它运行得很好。

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

假设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)

你现在将把新的公钥放在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,而不需要从两个存储库输入任何密码。

如果你有多台机器,你可以把钥匙复制到每台机器上,然后重复使用,但我建议做一些跑腿的工作,每台机器生成一个钥匙,然后回收。你将有更多的钥匙要处理,但如果其中一个被泄露,你就不会那么脆弱了。

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

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

由于id_rsa_work文件在路径~/.ssh/中不存在,我手动创建了这个文件,它不起作用:(

我在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

为repo设置远程url:

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

    git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
    
  • For repo in Host github-abc:

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

Explaination

Options in ~/.ssh/config:

  • Host github-<identify_specific_user>
    Host could be any value that could identify a host plus an account, it don't need to be a real host, e.g github-kc identify one of my account on github for my local laptop,

    When set remote url for a git repo, this is the value to put after git@, that's how a repo maps to a Host, e.g git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git


  • [Following are sub options of Host]
  • Hostname
    specify the actual hostname, just use github.com for github,
  • User git
    the user is always git for github,
  • IdentityFile
    specify key to use, just put the path the a public key,
  • LogLevel
    specify log level to debug, if any issue, DEBUG3 gives the most detailed info.

在我的例子中,上面的解决方案都没有解决我的问题,但是ssh-agent解决了。基本上,我做了以下事情:

  1. 使用ssh-keygen生成密钥对。它将生成一个密钥对(在本例中为.\keyfile.\keyfile.pub)

    ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile < / p >

  2. keyfile.pub上传到git提供程序

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

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

  1. 使用ssh-keygen -t rsa创建新的身份文件。给它一个像proj1.id_rsa这样的替代选项,并毫无疑问地命中,因为你不需要密码短语。
  2. .ssh/config中添加新section:

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

Take into account the first section and note that proj1.github.com we will back to the section later.

  1. Add the identity to ssh agent ssh-add ~/.ssh/proj1.id_rsa
  2. That what I messed first time - now when you want to clone a proj1 repo you do it using proj1.github.com (exactly the host from the config file). git clone git@proj1.github.com.

A good tutorial.

Don't mess up with hosts

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

在你想要使用不同键的存储库中,运行:

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

如果您的密钥是受密码保护的,并且您不想每次都输入密码,那么您必须将其添加到ssh-agent。下面是如何为ubuntumacOS做这件事。

使用全局git配置和条件包含(参见example),也可以将这种方法扩展到多个存储库。

遵循以下步骤来解决这个问题,它看起来太长了,但相信我,它不会超过5分钟:

步骤1:创建两个ssh密钥对:

ssh-keygen -t rsa -C "your_email@youremail.com"

它将在这里创建两个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配置

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"

使用多个Git帐户和克隆而不做任何更改的最简单方法是将您的用户名添加到ssh配置中。

  1. ~/.ssh/config开放。如果一个人不存在,就去创造
  2. 添加主机条目,如下所示
Host github.com:<YOUR_GITHUB_USERNAME>
AddKeysToAgent yes
IdentityFile ~/.ssh/<YOUR_SSH_KEY_FILENAME>

替换& lt; YOUR_GITHUB_USERNAME>与你想要的github用户名(个人或工作)替换& lt; YOUR_SSH_KEY_FILENAME>与你的密钥文件名在。ssh文件夹(例如:id_ed25519)。 为每个要维护的github帐户添加一条主机记录

现在git的克隆就像git clone github.com:<YOUR_GITHUB_USERNAME>/your-repo.git一样简单。克隆时不需要记住自定义gihub域;-)

做了一个主旨与进一步的信息https://gist.github.com/udantha/fed5439630eaf4651272f4fba6e1c6a3