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

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

答案

从我的.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

等等。

您可以指示 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 也不会尝试为.ssh/id_rsa要求输入密码。

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

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文件中。

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

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

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

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

chmod 0600 ~/.ssh/xxx_id_rsa

先前的答案已正确解释了创建配置文件以管理多个 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。

  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>

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

    $ 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

在这里查看更多

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

步骤如下:

  1. $ ssh-agent bash
  2. $ ssh-add /path.to/private/key例如ssh-add ~/.ssh/id_rsa $ 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

我有两个 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

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

使用 ssh-agent 作为密钥。

现在,对于最新版本的 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/*