在一个客户端上使用多个SSH私钥的最佳方法


869

我想使用多个私钥连接到不同的服务器或同一服务器的不同部分(我的用途是服务器的系统管理,Git的管理以及同一服务器内的正常Git使用)。我试图简单地将密钥堆叠在id_rsa文件中无济于事。

显然,一种简单的方法是使用以下命令

ssh -i <key location> login@server.example.com 

那很麻烦。

关于如何进行此操作的任何建议都容易一点?


1
我写了这篇文章,深入探讨了各种配置及其优点/缺点。
拉菲

Answers:


1233

来自我.ssh/config

Host myshortname realname.example.com
    HostName realname.example.com
    IdentityFile ~/.ssh/realname_rsa # private key for realname
    User remoteusername

Host myother realname2.example.org
    HostName realname2.example.org
    IdentityFile ~/.ssh/realname2_rsa  # different private key for realname2
    User remoteusername

等等。


24
谢谢兰达尔!我做了一些对.ssh / config的挖掘,发现了这一点: github.com/guides/multiple-github-accounts为指明了正确的方向。
贾斯汀2010年

6
这是一个很大的帮助(除了stackoverflow.com/a/3828682/169153)。如果您想使用油灰键,请在此处遵循此文档:blog.padraigkitterick.com/2007/09/16/…–
Urda

2
我发现这篇文章非常有帮助。创建配置文件时发生的一个错误是我将.txt文件放在.ssh文件夹中,而不是运行“ touch”命令来创建配置文件。
M_x_r 2012年

53
请注意,您还可以为,指定多个IdentityFile条目Host,然后在连接时按顺序尝试。
sschuberth

12
使用IdentitiesOnly yes防止的〜/ .ssh / id_rsa或任何其它身份。(本来是编辑)
user3338098 2015年

369

您可以指示ssh在连接时连续尝试多个键。就是这样:

$ cat ~/.ssh/config
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_rsa_old
IdentityFile ~/.ssh/id_ed25519
# ... and so on

$ ssh server.example.com -v
....
debug1: Next authentication method: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa
debug1: read PEM private key done: type RSA
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/example/.ssh/id_rsa_old
debug1: read PEM private key done: type RSA
....
[server ~]$

这样,您不必指定哪个密钥可与哪个服务器一起使用。它只会使用第一个工作密钥。

同样,只有在给定服务器愿意接受密钥的情况下,您才输入密码。如上所示,.ssh/id_rsa即使没有密码,ssh也不会尝试要求输入密码。

当然,它不会像其他答案中那样超越每个服务器的配置,但是至少您不必为连接到的所有服务器添加配置!


12
对于提出的问题,这是一个绝佳的解决方案,但并不能完全满足要求者的需求。对我来说,这是正确的解决方案,它完全满足“在一个客户端上使用多个SSH私钥的最佳方法”的需求。
韦德

2
在配置文件中的主机声明下,这似乎不起作用
Maksim Luzik 17-4-12

29
这在git上不能很好地工作,就像您有两个github部署密钥一样,列表中的第一个密钥是有效的并且可以使用,但是github会抱怨存储库不匹配。
亚当·里斯

这是一种更动态的方法,在某些情况下效果很好。谢谢你
gbolo

7
请注意,在这些服务器上是否有类似fail2ban的信息。您可能会陷入其中的一个牢狱中……由于其他键产生的尝试失败...
Piccolo

254

Randal Schwartz回答几乎一路帮助了我。我在服务器上使用了不同的用户名,因此必须将User关键字添加到文件中:

Host           friendly-name
HostName       long.and.cumbersome.server.name
IdentityFile   ~/.ssh/private_ssh_file
User           username-on-remote-machine

现在,您可以使用友好名称进行连接:

ssh friendly-name

OpenSSH手册页上可以找到更多关键字。注意:列出的某些关键字可能已经存在于/ etc / ssh / ssh_config文件中。


如果我没记错的话,您通常在与user @ host连接时直接在URL中指定
a1an 2013年

3
我更喜欢使用'Port'关键字。另一个有趣的关键字是“ StrictHostKeyChecking”。
伊桑(Ethan)2013年

119

先前的答案已正确说明了创建配置文件以管理多个ssh密钥的方法。我认为,还需要说明的重要事情是在克隆存储库时用别名替换主机名

假设您公司的GitHub帐户的用户名是abc1234。并假设您的个人GitHub帐户的用户名是jack1234

并且,假设您已经创建了两个RSA密钥,即id_rsa_companyid_rsa_personal。因此,您的配置文件将如下所示:

# Company account
Host company
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_company

# Personal account
Host personal
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_personal

现在,当您从公司的GitHub帐户克隆存储库 (名为demo)时,存储库URL将类似于:

Repo URL: git@github.com:abc1234/demo.git

现在,在执行时git clone,您应该将上述存储库URL修改为:

git@company:abc1234/demo.git

请注意,现在如何将github.com替换为我们在配置文件中定义的别名“ company”。

同样,您必须根据配置文件中提供的别名来修改个人帐户中存储库的克隆URL。


10
我希望我可以不止一次赞成这个答案...这是解决此问题的正确方法,并且比其他方法更安全,更快捷。更具扩展性(允许为同一主机名定义不同的密钥)
Guyarad

4
不再浪费时间,这就是答案。非常感谢。
路易斯·米兰尼斯

2
我真的希望我能早点找到这个答案……但是总比没有好,谢谢!
希尔迪,

2
很好的解释!对我来说很完美。而且,如果您忘记了使用别名克隆存储库,则通常可以在此后编辑远程原始URL。
tkahn

1
仅需支付出席费,因为配置文件必须为(chmod 600)
Christiano Matos

105
foo:~$ssh-add ~/.ssh/xxx_id_rsa

确保在添加以下内容之前对其进行测试:

ssh -i ~/.ssh/xxx_id_rsa username@example.com

如果您对错误有任何疑问,有时更改文件的安全性将有所帮助:

chmod 0600 ~/.ssh/xxx_id_rsa

4
我认为这是最简洁,优雅的解决方案。像魅力一样工作!
artur 2010年

@Bobo可以将其放在您的bashrc或bash_profile中(或其他等效于mac的东西)吗?
T0xicCode 2013年

6
chmod 0600 +
1-

对我来说就像是一种魅力(别忘了0600个烫发)。
Dmytro Uhnichenko

1
来自Mac上的ubuntu,这正是我所需要的。
hariom '16

42
  1. 生成SSH密钥:

    $ ssh-keygen -t rsa -C <email1@example.com>
    
  2. 产生another SSH key

    $ ssh-keygen -t rsa -f ~/.ssh/accountB -C <email2@example.com>
    

    现在,目录中应存在两个公用密钥(id_rsa.pubaccountB.pub~/.ssh/

    $ ls -l ~/.ssh     # see the files of '~/.ssh/' directory 
    
  3. 创建~/.ssh/config具有以下内容的配置文件:

    $ nano ~/.ssh/config
    
    Host bitbucket.org  
        User git  
        Hostname bitbucket.org
        PreferredAuthentications publickey  
        IdentityFile ~/.ssh/id_rsa  
    
    Host bitbucket-accountB  
        User git  
        Hostname bitbucket.org  
        PreferredAuthentications publickey  
        IdentitiesOnly yes  
        IdentityFile ~/.ssh/accountB  
    
  4. default帐户克隆。

    $ git clone git@bitbucket.org:username/project.git
    
  5. accountB帐户克隆。

    $ git clone git@bitbucket-accountB:username/project.git
    

在这里查看更多


24

我同意Tuomas关于使用ssh-agent的意见。我还想添加第二个私钥来工作,本教程对我来说就像是一种魅力。

步骤如下:

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key 例如 ssh-add ~/.ssh/id_rsa
  3. 验证者 $ ssh-add -l
  4. $ssh -v <host url>例如测试ssh -v git@assembla.com

4
已经使用ssh-agent了多年,我最近切换到使用侏儒gnome-keyring我的中i3西医。原因很简单:Gnome的Keyring管理器自动处理添加和删除ssh密钥,而无需记住ssh-add。此外,还提供了一个密码来解锁(为安全起见,在指定的时间超时)。给每个人自己。由于我在Arch上使用了gnome设置,因此在我的设置中即插即用。如果您是防侏儒,请忽略此评论。
eduncan911

@ eduncan911,我同意gnome-keyring可能会有所帮助,但它并不能真正处理ed25519密钥,因此对我来说不是入门者。更新:我从wiki.archlinux.org/index.php/GNOME/…看到,它现在使用系统的ssh-agent,因此不再是问题。
布莱恩·明顿

15

我有两个Bitbucket帐户并想分别为两个帐户存储单独的SSH密钥时,就遇到了这个问题。这对我有用。

我创建了两个单独的ssh配置,如下所示。

Host personal.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/personal
Host work.bitbucket.org
    HostName bitbucket.org
    User git
    IdentityFile /Users/username/.ssh/work

现在,当我不得不从工作帐户克隆存储库时,命令如下。

git clone git@bitbucket.org:teamname/project.git

我必须将此命令修改为:

git clone git@**work**.bitbucket.org:teamname/project.git

同样,我个人帐户中的clone命令必须修改为

git clone git @ personal .bitbucket.org:name / personalproject.git

请参阅此链接以获取更多信息。



11

现在,对于最新版本的git,我们可以在存储库特定的git配置文件中指定sshCommand

  [core]
      repositoryformatversion = 0
      filemode = true
      bare = false
      logallrefupdates = true
      sshCommand = ssh -i ~/.ssh/id_rsa_user   
   [remote "origin"]
      url = git@bitbucket.org:user/repo.git
      fetch = +refs/heads/*:refs/remotes/origin/*

1

重要提示:您必须启动ssh-agent

您必须先使用以下命令使用ssh-add才能启动ssh-agent(如果尚未运行):

eval `ssh-agent -s` # start the agent

ssh-add id_rsa_2 # where id_rsa_2 is your new private key file

请注意,eval命令在Windows的GIT bash上启动代理。其他环境可能使用变体来启动SSH代理。


1

您可以config~/.ssh文件夹中创建一个名为的配置文件。它可以包含:

Host aws
    HostName *yourip*
    User *youruser*
    IdentityFile *idFile*

这将允许您连接到这样的机器

 ssh aws

1

在ubuntu 18.04上没有任何事可做。

成功创建第二个ssh密钥后,系统将尝试为每个连接查找匹配的ssh密钥。

为了清楚起见,您可以使用以下命令创建新密钥

# generate key make sure you give it a new name (id_rsa_server2)
ssh-keygen 
# make sure ssh agent is running
eval `ssh-agent`
# add the new key
ssh-add ~/.ssh/id_rsa_server2
# get the public key to add it to a remote system for authentication
cat ~/.ssh/id_rsa_server2.pub

1

GITHUB中的多个密钥对

1.0 SSH配置文件

1.1创建〜/ .ssh / config

1.2 chmod 600〜/ .ssh / config(必须)

1.3在文件中输入以下内容:

寄送披萨

主机名github.com

PreferredAuthentications publickey#可选

IdentityFile〜/ .ssh / privatekey1

案例A:新鲜的GIT克隆

使用以下命令git clone:

$ git clone git @ pizza:yourgitusername / pizzahut_repo.git

注意:如果将来要更改.ssh / config的主机名“ pizza”,请进入git cloned文件夹,编辑.git / config文件的url行(请参阅案例B)

案例B:已经拥有Git克隆文件夹

2.1转到克隆的文件夹,然后转到.git文件夹

2.2编辑配置文件

2.3将网址从旧更新为新:

(Old) url = git@github.com:yourgitusername/pizzahut_repo.git    

(New) url = git@pizza:yourgitusername/pizzahut_repo.git


1

对我来说,唯一可行的解​​决方案是简单地添加 ~/.ssh/config

Host *
  IdentityFile ~/.ssh/your_ssh_key
  IdentityFile ~/.ssh/your_ssh_key2
  IdentityFile ~/.ssh/your_ssh_key3
  AddKeysToAgent yes

your_ssh_key 没有任何扩展名,请勿使用 .pub



0

正如atlassian博客页面上的seeend一样,.ssh中 生成一个配置,其中包括以下文本:

#user1 account
 Host bitbucket.org-user1
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user1
     IdentitiesOnly yes

 #user2 account
 Host bitbucket.org-user2
     HostName bitbucket.org
     User git
     IdentityFile ~/.ssh/user2
     IdentitiesOnly yes

然后,您可以使用后缀域进行检出,并且在项目中可以在本地配置作者名称等。


0

您可以尝试使用 sshmulti npm软件包来维护多个ssh密钥。


我强烈建议不要将npm用于此类操作。它具有一连串的依赖关系,在简短的检查中,其中包括一系列孤独的开发人员和数年的旧程序包。sshmulti npm页面本身声明它未经测试。
Jack Wasey

0

这是我从答案中得到启发的解决方案 @ sajib-khan得到。未设置默认配置,这是我在gitlab上的个人帐户,其他指定的是我的公司帐户。这是我做的:

生成ssh密钥

ssh-keygen -t rsa -f ~/.ssh/company -C "name.surname@company.com"

编辑ssh配置

nano ~/.ssh/config

    Host company.gitlab.com
    HostName gitlab.com
    PreferredAuthentications publickey  
    IdentityFile ~/.ssh/company

删除缓存的ssh密钥

ssh-add -D

测试一下!

ssh -T git@company.gitlab.com

欢迎来到GitLab,@ hugo.sohm!

ssh -T git@gitlab.com

欢迎来到GitLab,@ HugoSohm!

用它 !

公司帐号

$ git clone git@company.gitlab.com:group/project.git

个人/默认帐户

$ git clone git@gitlab.com:username/project.git

这里是,我用,希望它能帮助!


0

我喜欢在〜/ .ssh / config中设置以下内容的方法:

# Config for Github to support multiple Github keys
Host  github.com
  HostName github.com
  User git
# UseKeychain adds each keys passphrase to the keychain so you don't have to enter the passphrase each time.
  UseKeychain yes
# AddKeysToAgent would add the key to the agent whenever it is used, which might lead to debugging confusion since then sometimes the one repo works and sometimes the other depending on which key is used first.
#  AddKeysToAgent yes
# I only use my private id file so all private repos don't need the env var `GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa"` to be set.
  IdentityFile ~/.ssh/id_rsa

然后,在您的仓库中,您可以创建一个.env包含要使用的ssh命令的文件:

GIT_SSH_COMMAND="ssh -i ~/.ssh/your_ssh_key"

如果您随后使用例如dotenv,则环境变量将自动导出,并且可以通过呐喊来指定每个项目/目录的密钥。该密码短语仅添加一次,因为它已添加到钥匙串中。

此解决方案可与git完美配合,并且设计为可在Mac上使用(由于UseKeychain)。

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.