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

Best way to use multiple SSH private keys on one client

我想使用多个私钥连接到不同的服务器或同一服务器的不同部分(我的用途是服务器的系统管理、Git管理和同一服务器中的正常Git使用)。我试图简单地将密钥堆叠到id_rsa文件中,但没有用。

显然,一个简单的方法就是使用命令

1
ssh -i <key location> [email protected]

那太麻烦了。

关于如何做这件事有什么建议吗?


从我的.ssh/config中:

1
2
3
4
5
6
7
8
9
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

等等。


您可以指示ssh在连接时连续尝试多个密钥。以下是如何:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ 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没有尝试为.ssh/id_rsa请求密码,即使它有密码。

当然,它不会比其他答案中的每台服务器配置高,但至少您不必为所有连接到的服务器添加配置!


兰德尔·施瓦茨的回答几乎帮了我大忙。服务器上的用户名不同,因此我必须将用户关键字添加到文件中:

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

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

1
ssh friendly-name

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


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

请确保在添加之前对其进行测试:

1
ssh -i ~/.ssh/xxx_id_rsa [email protected]

如果您有任何错误问题,有时更改文件的安全性有助于:

1
chmod 0600 ~/.ssh/xxx_id_rsa


前面的答案已经正确地解释了如何创建配置文件来管理多个ssh密钥。我认为,还需要解释的一件重要事情是在克隆存储库时用别名替换主机名。

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

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

1
2
3
4
5
6
7
8
9
10
11
# 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将类似于:

1
Repo URL: [email protected]:abc1234/demo.git

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

1
git@company:abc1234/demo.git

注意现在如何用配置文件中定义的别名"company"替换github.com。

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


我同意Tuomas使用ssh代理。我还想为工作添加第二个私钥,本教程对我来说非常有吸引力。

步骤如下:

  • $ ssh-agent bash
  • $ ssh-add /path.to/private/key,如ssh-add ~/.ssh/id_rsa
  • $ ssh-add -l验证
  • $ssh -v 进行测试,如ssh -v [email protected]

  • 生成ssh密钥:

    1
    $ ssh-keygen -t rsa -C
  • 生成another SSH key

    1
    $ ssh-keygen -t rsa -f ~/.ssh/accountB -C

    现在,两个公钥(id_rsa.pub,accountb.pub)应该存在于~/.ssh/目录中。

    1
    $ ls -l ~/.ssh     # see the files of '~/.ssh/' directory
  • 创建配置文件~/.ssh/config,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ 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
  • default帐户克隆。

    1
    $ git clone [email protected]:username/project.git
  • accountB帐户克隆。

    1
    $ git clone git@bitbucket-accountB:username/project.git
  • 在这里看到更多


    前一段时间我遇到过这个问题,当时我有两个bitback帐户,想要为这两个帐户分别存储SSH密钥。这就是我的工作。

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

    1
    2
    3
    4
    5
    6
    7
    8
    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

    现在,当我必须从我的工作帐户克隆一个存储库时,命令如下。

    1
    git clone [email protected]:teamname/project.git

    我必须将此命令修改为:

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

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

    git clone [email protected]:name/personalproject.git

    有关详细信息,请参阅此链接。


    对您的密钥使用ssh代理。


    现在,使用最新版本的git,我们可以在存储库特定的git配置文件中指定sshcommand。

    1
    2
    3
    4
    5
    6
    7
    8
    9
      [core]
          repositoryformatversion = 0
          filemode = true
          bare = false
          logallrefupdates = true
          sshCommand = ssh -i ~/.ssh/id_rsa_user  
       [remote"origin"]
          url = [email protected]:user/repo.git
          fetch = +refs/heads/*:refs/remotes/origin/*

    重要提示:必须启动ssh代理

    在使用ssh add之前,必须启动ssh代理(如果它尚未运行),如下所示:

    1
    2
    3
    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代理。


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

    1
    2
    3
    4
    Host aws
        HostName *yourip*
        User *youruser*
        IdentityFile *idFile*

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

    1
     ssh aws

    正如Atlassian博客页面上提到的那样在.ssh中生成配置,包括以下文本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #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

    然后,您可以简单地使用后缀域签出,在项目中,您可以在本地配置作者名称等。


    在运行openssh_5.3p1、openssl 1.0.1e-fips的Centos6.5上,我通过重命名密钥文件来解决这个问题,使它们都没有默认名称。my.ssh目录包含id_rsa_foo和id_rsa_bar,但不包含id_rsa等。