1044

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

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

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

那是相当麻烦的。

关于如何更轻松地执行此操作的任何建议?

4

21 回答 21

1449

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

ssh myother

等等。

于 2010-03-10T18:46:39.323 回答
504

您可以指示 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 也不会尝试询问密码。

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

于 2015-10-20T04:56:48.350 回答
272

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

于 2010-09-30T07:37:27.357 回答
220

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

于 2016-07-19T09:06:09.927 回答
116
ssh-add ~/.ssh/xxx_id_rsa

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

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

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

chmod 0600 ~/.ssh/xxx_id_rsa
于 2010-08-15T05:31:57.530 回答
67
  1. 生成 SSH 密钥:

     $ ssh-keygen -t rsa -C <email1@example.com>
    
  2. 生成另一个 SSH 密钥

     $ 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
    

注意:由于该User git指令,您可以省略git@repo URL 的部分,缩短您的clone命令,如下所示:

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

这是该指令的唯一目的。如果您不需要它(例如,您总是从网站复制粘贴 git clone 命令),您可以将其排除在配置之外。

在这里查看更多

于 2016-12-14T05:39:48.600 回答
28

我同意 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
于 2014-10-21T09:30:54.890 回答
22

现在,使用最新版本的 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/*
于 2018-08-19T14:29:18.223 回答
17

前段时间我遇到过这个问题,当时我有两个 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

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

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

有关更多信息,请参阅此链接

于 2016-09-02T06:58:08.040 回答
9

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

于 2010-03-10T18:44:02.990 回答
9

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

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

your_ssh_key没有任何扩展名。不要使用.pub.

于 2020-05-25T13:09:07.890 回答
8

这是我使用的解决方案,灵感来自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

这是我使用的来源

于 2020-04-28T09:20:19.637 回答
2

GitHub 上的多个密钥对

1.0 SSH配置文件

1.1创建~/.ssh/config

1.2 chmod 600 ~/.ssh/config(必须

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

主持披萨

主机名 github.com

PreferredAuthentications 公钥 # 可选

身份文件 ~/.ssh/privatekey1

案例 A:全新的 Git 克隆

使用此命令进行 Git 克隆:

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

注意:如果您以后想更改 .ssh/config 的主机名“pizza”,请进入 Git 克隆文件夹,编辑 .git/config 文件 URL 行(见案例 B)

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

2.1 进入克隆的文件夹,然后进入.git文件夹

2.2 编辑配置文件

2.3 将 URL 从 *old 更新为new

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

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

于 2020-01-08T13:16:42.067 回答
2

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

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

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

 ssh aws
于 2016-01-18T00:27:32.123 回答
2

对于那些使用的人,我强烈建议使用EC2 Instance Connect

Amazon EC2 Instance Connect 提供了一种使用安全外壳 (SSH) 连接到您的实例的简单且安全的方式。

借助 EC2 Instance Connect,您可以使用 AWS Identity and Access Management (IAM) 策略和原则来控制对您的实例的 SSH 访问,从而无需共享和管理 SSH 密钥。

安装相关软件包(pip install ec2instanceconnectcli或直接克隆repo)后,您只需更改实例 id 即可非常轻松地连接到多个 EC2 实例

在此处输入图像描述


幕后发生了什么?

当您使用 EC2 Instance Connect 连接到实例时,Instance Connect API 会将一次性使用的 SSH 公钥推送到实例元数据,并在其中保留 60 秒。附加到您的 IAM 用户的 IAM 策略授权您的 IAM 用户将公有密钥推送到实例元数据。

SSH 守护程序使用安装 Instance Connect 时配置的 AuthorizedKeysCommand 和 AuthorizedKeysCommandUser 从实例元数据中查找公钥以进行身份​​验证,并将您连接到实例。

(*) Amazon Linux 2 2.0.20190618 或更高版本和 Ubuntu 20.04 或更高版本预配置了 EC2 Instance Connect。对于其他受支持的 Linux 发行版,您必须为将支持使用 Instance Connect 的每个实例设置 Instance Connect。这是每个实例的一次性要求。


链接:

使用 EC2 Instance Connect设置 EC2 Instance Connect
Connect 使用
Amazon EC2 Instance Connect 保护您的堡垒主机


于 2020-10-16T12:58:54.960 回答
1

Atlassian 博客页面所述,在.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

然后您可以简单地使用后缀域结帐,并且在项目中您可以在本地配置作者姓名等。

于 2019-03-28T15:59:23.783 回答
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 代理。

于 2017-07-27T10:31:26.730 回答
1

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

# Configuration 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 repository works and sometimes the
# other depending on which key is used first.
#  AddKeysToAgent yes

# I only use my private id file so all private
# repositories don't need the environment variable
# `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)。

于 2020-05-12T15:23:31.943 回答
1

Ubuntu 18.04 (Bionic Beaver) 上无事可做。

成功创建第二个 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
于 2019-07-09T04:44:32.553 回答
0

在运行 OpenSSH_5.3p1 和 OpenSSL 1.0.1e-fips 的CentOS 6.5 上,我通过重命名我的密钥文件以使它们都没有默认名称来解决问题。

我的 .ssh 目录包含 id_rsa_foo 和 id_rsa_bar,但没有 id_rsa 等。

于 2017-03-16T21:07:23.440 回答
-1

你可以试试这个sshmulti npm 包来维护多个 SSH 密钥。

于 2020-03-04T16:18:24.197 回答