我想使用多个私钥连接到不同服务器或同一服务器的不同部分(我的用途是服务器的系统管理、Git 的管理以及同一服务器内的正常 Git 使用)。我尝试简单地堆叠id_rsa
文件中的密钥无济于事。
显然,一个简单的方法是使用命令
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 myshortname
ssh myother
等等。
您可以指示 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 也不会尝试询问密码。
当然,它不会像其他答案那样胜过每个服务器的配置,但至少您不必为连接到的所有服务器添加配置!
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文件中。
前面的答案已经正确解释了创建配置文件来管理多个 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: git@github.com:abc1234/demo.git
现在,在执行此操作时git clone
,您应该将上述存储库 URL 修改为:
git@company:abc1234/demo.git
请注意 github.com 现在如何替换为我们在配置文件中定义的别名“company”。
同样,您必须根据配置文件中提供的别名修改个人帐户中存储库的克隆 URL。
ssh-add ~/.ssh/xxx_id_rsa
确保在添加之前对其进行测试:
ssh -i ~/.ssh/xxx_id_rsa username@example.com
如果您对错误有任何问题,有时更改文件的安全性会有所帮助:
chmod 0600 ~/.ssh/xxx_id_rsa
生成 SSH 密钥:
$ ssh-keygen -t rsa -C <email1@example.com>
生成另一个 SSH 密钥:
$ ssh-keygen -t rsa -f ~/.ssh/accountB -C <email2@example.com>
现在,目录中应该存在两个公钥(id_rsa.pub、accountB.pub~/.ssh/
) 。
$ ls -l ~/.ssh # see the files of '~/.ssh/' directory
~/.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
default
从帐户克隆。
$ git clone git@bitbucket.org:username/project.git
从accountB
帐户中克隆。
$ git clone git@bitbucket-accountB:username/project.git
注意:由于该User git
指令,您可以省略git@
repo URL 的部分,缩短您的clone
命令,如下所示:
$ git clone bitbucket-accountB:username/project.git
这是该指令的唯一目的。如果您不需要它(例如,您总是从网站复制粘贴 git clone 命令),您可以将其排除在配置之外。
我同意 Tuomas 关于使用 ssh-agent 的观点。我还想为工作添加第二个私钥,这个教程对我来说就像一个魅力。
步骤如下:
$ ssh-agent bash
$ ssh-add /path.to/private/key
例如ssh-add ~/.ssh/id_rsa
$ ssh-add -l
$ssh -v <host url>
用例如测试它ssh -v git@assembla.com
现在,使用最新版本的 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/*
前段时间我遇到过这个问题,当时我有两个 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
有关更多信息,请参阅此链接。
使用 ssh-agent 作为您的密钥。
对我来说,唯一可行的解决方案是简单地将其添加到文件中~/.ssh/config
:
Host *
IdentityFile ~/.ssh/your_ssh_key
IdentityFile ~/.ssh/your_ssh_key2
IdentityFile ~/.ssh/your_ssh_key3
AddKeysToAgent yes
your_ssh_key
没有任何扩展名。不要使用.pub
.
这是我使用的解决方案,灵感来自sajib-khan 的回答。默认配置未设置;这是我在GitLab上的个人帐户,另一个指定的是我的公司帐户。这是我所做的:
ssh-keygen -t rsa -f ~/.ssh/company -C "name.surname@company.com"
nano ~/.ssh/config
Host company.gitlab.com
HostName gitlab.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/company
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
这是我使用的来源。
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
config
您可以在您的文件夹中创建一个名为的配置文件~/.ssh
。它可以包含:
Host aws
HostName *yourip*
User *youruser*
IdentityFile *idFile*
这将允许您连接到这样的机器
ssh aws
对于那些使用aws的人,我强烈建议使用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 保护您的堡垒主机
如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
然后您可以简单地使用后缀域结帐,并且在项目中您可以在本地配置作者姓名等。
重要提示:您必须启动 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 代理。
我喜欢在文件 ~/.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
)。
在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
在运行 OpenSSH_5.3p1 和 OpenSSL 1.0.1e-fips 的CentOS 6.5 上,我通过重命名我的密钥文件以使它们都没有默认名称来解决问题。
我的 .ssh 目录包含 id_rsa_foo 和 id_rsa_bar,但没有 id_rsa 等。
你可以试试这个sshmulti npm 包来维护多个 SSH 密钥。