ssh多个公钥 - ssh密钥




多个GitHub帐户和SSH配置 (7)

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

Repos使用[email protected]:accountname从一个帐户访问

使用[email protected]:anotheraccount可以从其他帐户访问Repos [email protected]:anotheraccount

每个帐户都有自己的SSH密钥。 两个SSH密钥都已添加,并且我创建了一个配置文件。 我不相信配置文件是正确的。 我不太清楚如何指定使用[email protected]:accountname访问repos [email protected]:accountname应使用id_rsa[email protected]:anotheraccount应使用id_rsa_anotheraccount


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

ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "[email protected]"

由于id_rsa_work文件不存在于路径~/.ssh/ ,并且我手动创建此文件,并且它不工作:(


~/.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我的工作概要才ssh-add ~/.ssh/work_rsa 。 之后,连接到github使用正确的配置文件。 以前,他们默认第一个公钥。

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


我使用shell脚本将我切换到任何我想要“活跃”的帐户。 基本上,你从一个新的开始开始,让一个帐户配置正确并且正常工作,然后将这些文件移动到具有正确前缀的名称。 从此,您可以使用命令“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 "[email protected]"
git config --global github.user "dhoerl"        
# git config --global github.token "whatever_it_is" # now unused

ssh-add -D

这件事我非常幸运。 我还在Xcode中创建了一个运行脚本(对于Mac用户),所以它不会构建我的项目,除非我有适当的设置(自使用git以来):

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

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

我最近必须这样做,并且必须筛选所有这些答案和他们的评论以最终将信息拼凑在一起,所以为了您的方便,我将把它放在一个帖子中:


第1步:ssh密钥
创建您需要的任何密钥对。 在这个例子中,我将default / original'id_rsa'(这是默认值)和我的新'id_rsa-work'命名为:

ssh-keygen -t rsa -C "[email protected]"


第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 [email protected] (RSA)

如果您的输入不存在,那么运行:

ssh-add ~/.ssh/id_rsa_work


第4步:测试
为了测试你所做的一切正确,我建议进行以下快速检查:

$ ssh -T [email protected]
Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.

$ ssh -T [email protected]
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 [email protected]

它工作得很好。

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


比方说, alice是一个github.com用户,拥有2个或更多的私有仓库。 对于这个例子,我们将只使用两个名为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://[email protected]/alice/repo1.git"

最后,你去了存储库Settings > Deploy keys部分,并添加了alice_github.id_rsa.pub的内容

此时你可以在不输入密码的情况下做你的git pull origin master

但第二个存储库呢?

所以你的直觉就是抓住这个键并将它添加到repo2的Deploy键中,但是github.com会出错并告诉你键已经被使用了。

现在你去创建另一个密钥(使用ssh-keygen -t rsa -C "[email protected]" ,当然没有密码),并且这样就不会变得乱七八糟,你现在可以将你的密钥命名为:

  • 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的部署密钥配置上,但是现在你需要解决一个ssh问题。

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

您的.ssh/config文件指向github.com并且它不知道在执行pull操作时要使用哪个键。

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

所以第一件事是编辑你的repo克隆上的.git/config文件,所以它们看起来像这样:

对于repo1

[remote "origin"]
        url = "ssh://[email protected]/alice/repo1.git"

对于repo2

[remote "origin"]
        url = "ssh://[email protected]/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-keys