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

问题描述 投票:764回答:14

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

显然,一种直接的方法是使用该命令

ssh -i <key location> [email protected] 

这非常麻烦。

关于如何更轻松地做这件事的任何建议?

ssh ssh-keys openssh
14个回答
1117
投票

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

等等。


8
投票

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

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

1
投票

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

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

this link

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


1
投票

您可以在 [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/* 文件夹中创建名为eval `ssh-agent -s` # start the agent ssh-add id_rsa_2 # where id_rsa_2 is your new private key file 的配置文件。它可以包含:

config

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

~/.ssh

0
投票

在运行OpenSSH_5.3p1,OpenSSL 1.0.1e-fips的Centos 6.5上,我通过重命名我的密钥文件解决了这个问题,因此没有一个具有默认名称。我的.ssh目录包含id_rsa_foo和id_rsa_bar,但没有id_rsa等。


0
投票

正如提及Host aws HostName *yourip* User *youruser* IdentityFile *idFile* 在.ssh中生成一个配置,包括以下文本:

 ssh aws

然后您只需使用后缀域签出即可,在项目中您可以在本地配置作者姓名等。


0
投票

在ubuntu 18.04上没有任何关系。

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

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

atlassian blog page

278
投票

您可以指示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索要密码,即使它有一个密码。

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


245
投票

answer from 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 man page上找到。注意:列出的某些关键字可能已存在于/ etc / ssh / ssh_config文件中。


96
投票
foo:~$ssh-add ~/.ssh/xxx_id_rsa

确保在添加之前测试它:

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

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

chmod 0600 ~/.ssh/xxx_id_rsa

84
投票

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

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

并且,假设您已创建了两个RSA密钥,即id_rsa_company和id_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: [email protected]:abc1234/demo.git

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

git@company:abc1234/demo.git

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

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


24
投票
  1. 生成SSH密钥: $ ssh-keygen -t rsa -C <[email protected]>
  2. 生成qazxsw poi: qazxsw poi 现在,another SSH key目录中应该存在两个公钥(id_rsa.pub,accountB.pub)。 $ ssh-keygen -t rsa -f ~/.ssh/accountB -C <[email protected]>
  3. 使用以下内容创建配置文件~/.ssh/$ ls -l ~/.ssh # see the files of '~/.ssh/' directory
  4. 克隆来自~/.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
  5. 克隆来自default账号。 $ git clone [email protected]:username/project.git

accountB


22
投票

我同意Tuomas关于使用ssh-agent的观点。我还想为工作添加第二个私钥,$ git clone git@bitbucket-accountB:username/project.git 对我来说就像一个魅力。

步骤如下:

  1. See More Here
  2. this tutorial例如$ ssh-agent bash
  3. $ ssh-add /path.to/private/key验证
  4. ssh-add ~/.ssh/id_rsa测试它,例如$ ssh-add -l

13
投票

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

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

$ssh -v <host url>

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

ssh -v [email protected]

我不得不将此命令修改为:

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 [email protected]:name / personalproject.git

有关更多信息,请参阅git clone [email protected]:teamname/project.git


11
投票

使用ssh-agent作为密钥。

© www.soinside.com 2019 - 2024. All rights reserved.