Best way to use multiple SSH private keys on one client
我想使用多个私钥连接到不同的服务器或同一服务器的不同部分(我的用途是服务器的系统管理、Git管理和同一服务器中的正常Git使用)。我试图简单地将密钥堆叠到
显然,一个简单的方法就是使用命令
1 | ssh -i <key location> [email protected] |
那太麻烦了。
关于如何做这件事有什么建议吗?
从我的
1 2 3 4 5 6 7 8 9 | 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在连接时连续尝试多个密钥。以下是如何:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ 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没有尝试为
当然,它不会比其他答案中的每台服务器配置高,但至少您不必为所有连接到的服务器添加配置!
兰德尔·施瓦茨的回答几乎帮了我大忙。服务器上的用户名不同,因此我必须将用户关键字添加到文件中:
1 2 3 4 | Host friendly-name HostName long.and.cumbersome.server.name IdentityFile ~/.ssh/private_ssh_file User username-on-remote-machine |
现在您可以使用友好名称进行连接:
1 | ssh friendly-name |
在OpenSSH手册页上可以找到更多的关键字。注意:列出的一些关键字可能已经存在于/etc/ssh/ssh_配置文件中。
1 | foo:~$ssh-add ~/.ssh/xxx_id_rsa |
请确保在添加之前对其进行测试:
1 | ssh -i ~/.ssh/xxx_id_rsa [email protected] |
如果您有任何错误问题,有时更改文件的安全性有助于:
1 | chmod 0600 ~/.ssh/xxx_id_rsa |
前面的答案已经正确地解释了如何创建配置文件来管理多个ssh密钥。我认为,还需要解释的一件重要事情是在克隆存储库时用别名替换主机名。
假设您公司的github帐户的用户名是abc1234。假设您的个人Github帐户的用户名是jack1234
并且,假设您已经创建了两个RSA密钥,即ID_rsa_Company和ID_rsa_Personal。因此,您的配置文件如下所示:
1 2 3 4 5 6 7 8 9 10 11 | # 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将类似于:
1 | Repo URL: [email protected]:abc1234/demo.git |
现在,在执行
1 | git@company:abc1234/demo.git |
注意现在如何用配置文件中定义的别名"company"替换github.com。
同样,您必须根据配置文件中提供的别名修改个人帐户中存储库的克隆URL。
我同意Tuomas使用ssh代理。我还想为工作添加第二个私钥,本教程对我来说非常有吸引力。
步骤如下:
生成ssh密钥:
1 | $ ssh-keygen -t rsa -C |
生成
1 | $ ssh-keygen -t rsa -f ~/.ssh/accountB -C |
现在,两个公钥(id_rsa.pub,accountb.pub)应该存在于
1 | $ ls -l ~/.ssh # see the files of '~/.ssh/' directory |
创建配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $ 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 |
从
1 | $ git clone [email protected]:username/project.git |
从
1 | $ git clone git@bitbucket-accountB:username/project.git |
在这里看到更多
前一段时间我遇到过这个问题,当时我有两个bitback帐户,想要为这两个帐户分别存储SSH密钥。这就是我的工作。
我创建了两个单独的ssh配置,如下所示。
1 2 3 4 5 6 7 8 | 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 |
现在,当我必须从我的工作帐户克隆一个存储库时,命令如下。
1 | git clone [email protected]:teamname/project.git |
我必须将此命令修改为:
1 | git clone git@**work**.bitbucket.org:teamname/project.git |
同样,我个人帐户中的克隆命令也必须修改为
git clone [email protected]:name/personalproject.git
有关详细信息,请参阅此链接。
对您的密钥使用ssh代理。
现在,使用最新版本的git,我们可以在存储库特定的git配置文件中指定sshcommand。
1 2 3 4 5 6 7 8 9 | [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/* |
重要提示:必须启动ssh代理
在使用ssh add之前,必须启动ssh代理(如果它尚未运行),如下所示:
1 2 3 | 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代理。
您可以在
1 2 3 4 | Host aws HostName *yourip* User *youruser* IdentityFile *idFile* |
这将允许您连接到这样的机器
1 | ssh aws |
正如Atlassian博客页面上提到的那样在.ssh中生成配置,包括以下文本:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #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 |
然后,您可以简单地使用后缀域签出,在项目中,您可以在本地配置作者名称等。
在运行openssh_5.3p1、openssl 1.0.1e-fips的Centos6.5上,我通过重命名密钥文件来解决这个问题,使它们都没有默认名称。my.ssh目录包含id_rsa_foo和id_rsa_bar,但不包含id_rsa等。