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

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

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

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

这很麻烦。

任何build议如何去做这个更容易一点?

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

等等。

Randal Schwartz的回答几乎帮助了我。 我在服务器上有一个不同的用户名,所以我不得不将用户关键字添加到我的文件中:

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

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

 ssh friendly-name 

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

连接时,您可以指示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 ~]$ 

这样你就不必指定哪个服务器的关键function。 它只会使用第一个工作密钥。

如果给定的服务器愿意接受密钥,你也只能input密码。 正如上面看到的,ssh并没有试图为.ssh/id_rsa请求一个密码,即使它有一个。

当然,它不会像其他答案中的每台服务器configuration一样,但至less不必为所有连接的服务器添加configuration!

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

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

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

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

 chmod 0600 ~/.ssh/xxx_id_rsa 

我会同意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 -lvalidation
  4. $ssh -v <host url>testing它,例如ssh -v git@assembla.com

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

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

而且,假设您已经创build了两个RSA密钥,即id_rsa_companyid_rsa_personal 。 所以,你的configuration文件如下所示:

 # 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.comreplace为我们在configuration文件中定义的别名“company”。

同样,您必须根据configuration文件中提供的别名修改个人帐户中存储库的克隆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. 使用以下内容创buildconfiguration文件~/.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 

在这里看到更多

使用ssh-agent作为你的密钥。

我曾经遇到过这个问题,当时我有两个Bitbucket帐户,并且想要为两者存储单独的SSH密钥。 这是为我工作。

我创build了两个单独的sshconfiguration如下。

 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 

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

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

请参阅此链接了解更多信息。

您可以在~/.ssh文件夹中创build一个名为config的configuration文件。 它可以包含:

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

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

  ssh aws 

在运行OpenSSH_5.3p1,OpenSSL 1.0.1e-fips的Centos 6.5上,我通过重命名我的密钥文件来解决这个问题,所以他们都没有默认的名字。 我的.ssh目录包含id_rsa_foo和id_rsa_bar,但没有id_rsa等

重要提示:您必须启动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代理。