我想使用多个私钥连接到不同的服务器或同一服务器的不同部分(我的用途是服务器的系统管理,Git的管理以及同一服务器内的正常Git使用)。我试过简单地将id_rsa
文件中的密钥堆叠起来无济于事。
显然,直接的方法是使用命令
ssh -i <key location> login@server.example.com
这非常麻烦。
关于如何更容易地做这件事的任何建议?
答案 0 :(得分:1101)
来自我的.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
等等。
答案 1 :(得分:265)
连接时,您可以指示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
提供密码,即使它有一个密码。
当然,它并不像其他答案那样超出每服务器配置,但至少您不必为连接的所有服务器添加配置!
答案 2 :(得分:244)
answer from 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 man page找到更多关键字。 注意:列出的某些关键字可能已存在于 / etc / ssh / ssh_config 文件中。
答案 3 :(得分:95)
foo:~$ssh-add ~/.ssh/xxx_id_rsa
确保在添加以下内容之前对其进行测试:
ssh -i ~/.ssh/xxx_id_rsa username@example.com
如果您遇到任何错误问题,有时会更改文件的安全性有助于:
chmod 0600 ~/.ssh/xxx_id_rsa
答案 4 :(得分:78)
之前的答案已正确解释了创建配置文件以管理多个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现在如何替换别名&#34; company&#34;正如我们在配置文件中定义的那样。
类似地,您必须根据配置文件中提供的别名修改个人帐户中存储库的克隆URL。
答案 5 :(得分:23)
生成SSH密钥:
$ ssh-keygen -t rsa -C <email1@example.com>
生成another SSH key
:
$ ssh-keygen -t rsa -f ~/.ssh/accountB -C <email2@example.com>
现在,~/.ssh/
目录中应该存在两个公钥( id_rsa.pub , accountB.pub )。
$ 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
答案 6 :(得分:22)
我同意Tuomas关于使用ssh-agent的观点。我还想为工作添加第二个私钥,this tutorial对我来说就像一个魅力。
步骤如下:
$ 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
答案 7 :(得分:13)
我曾经遇到过这个问题,当时我有两个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 @ 个人 .bitbucket.org:name / personalproject.git
有关详细信息,请参阅this link。
答案 8 :(得分:11)
使用ssh-agent作为密钥。
答案 9 :(得分:6)
现在,对于最新版本的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/*
答案 10 :(得分:3)
这是我从the answer of sajib-khan得到启发的解决方案。未设置默认配置。这是我在GitLab上的个人帐户,指定的另一个是我的公司帐户。这是我所做的:
[[-2][ 4]
[-1][ 1]
[[ 1][ 1][ 1][ 1][ 1][ 1]] ∙ [ 0][ 0] = [[ 3][19]]
[ 1][ 1]
[ 2][ 4]
[ 3][ 9]]
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
欢迎来到GitLab,@ hugo.sohm!
ssh -T git@company.gitlab.com
欢迎来到GitLab,@ HugoSohm!
公司帐户
ssh -T git@gitlab.com
个人/默认帐户
git clone git@company.gitlab.com:group/project.git
这是我使用的source。
答案 11 :(得分:2)
对我来说,唯一可行的解决方案是将其简单地添加到文件$(".datepicker").datetimepicker({
enabledHours:[8,9,10,11,12,13,14,15,16,17,18,19]
});
中:
~/.ssh/config
Host *
IdentityFile ~/.ssh/your_ssh_key
IdentityFile ~/.ssh/your_ssh_key2
IdentityFile ~/.ssh/your_ssh_key3
AddKeysToAgent yes
没有任何扩展名。不要使用your_ssh_key
。
答案 12 :(得分:1)
对于与aws合作的人,我强烈建议与EC2 Instance Connect合作。
Amazon EC2实例连接提供了一种使用安全Shell(SSH)连接到您的实例的简单安全的方法。
通过EC2实例连接,您可以使用AWS Identity and Access Management(IAM)策略和原则来控制对实例的SSH访问,而无需共享和管理SSH密钥。
在安装相关软件包(pip install ec2instanceconnectcli
或直接克隆repo之后)您只需更改实例ID即可很容易地连接到多个EC2实例:
幕后发生了什么?
使用EC2实例连接连接到实例时,实例连接API会将一次性使用的SSH公钥推送到实例元数据中,并保留60秒。附加到您的IAM用户的IAM策略授权您的IAM用户将公钥推送到实例元数据。
SSH守护程序使用在安装实例连接时配置的AuthorizedKeysCommand和AuthorizedKeysCommandUser从实例元数据中查找公钥以进行身份验证,然后将您连接到实例。
(*)Amazon Linux 2 2.0.20190618或更高版本以及Ubuntu 20.04或更高版本已预先配置了EC2实例连接。 对于其他受支持的Linux发行版,必须为将使用Instance Connect支持的每个实例设置Instance Connect。这是每个实例的一次性要求。
链接:
Set up EC2 Instance Connect
Connect using EC2 Instance Connect
Securing your bastion hosts with Amazon EC2 Instance Connect
答案 13 :(得分:1)
1.0 SSH配置文件
1.1 创建〜/ .ssh / config
1.2 chmod 600〜/ .ssh / config(必须)
1.3在文件中输入以下内容:
匹萨披萨
HostName github.com
PreferredAuthentications公共密钥#可选
IdentityFile〜/ .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
答案 14 :(得分: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代理。
答案 15 :(得分:1)
您可以在config
文件夹中创建名为~/.ssh
的配置文件。它可以包含:
Host aws
HostName *yourip*
User *youruser*
IdentityFile *idFile*
这将允许您连接到这样的机器
ssh aws
答案 16 :(得分:0)
在Ubuntu 18.04上没有任何事可做。
成功创建第二个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
答案 17 :(得分:0)
正如atlassian blog page上的提及 在 .ssh 中生成包含以下文本的 config :
"Principal": {
"AWS": [
"arn:aws:iam::123:root",
"arn:aws:iam::456:root",
"arn:aws:iam::789:root",
"arn:aws:iam::101:root"
]
},
然后,您可以简单地使用后缀域进行检出,并且在项目中可以在本地配置作者姓名等。
答案 18 :(得分:0)
我喜欢在〜/ .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
)。
答案 19 :(得分:0)
在Centos 6.5上运行OpenSSH_5.3p1,OpenSSL 1.0.1e-fips,我通过重命名我的密钥文件解决了这个问题,因此没有一个具有默认名称。我的.ssh目录包含id_rsa_foo和id_rsa_bar但没有id_rsa等。
答案 20 :(得分:-1)
您可以尝试使用this sshmulti npm软件包来维护多个SSH密钥。