在一个客户端上使用多个SSH私钥的最佳方法
我想使用多个私钥连接到不同的服务器或同一服务器的不同部分(我使用的是服务器的系统pipe理,Git的pipe理和在同一服务器中的正常Git使用)。 我试图简单地堆叠在id_rsa
文件中的键无济于事。
显然,一个简单的方法是使用该命令
ssh -i <key location> login@server.example.com
这很麻烦。
任何build议如何去做这个更容易一点?
从我的.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 User remoteusername
等等。
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手册页find 。 注意:列出的一些关键字可能已经存在于您的/ etc / ssh / ssh_config文件中。
连接时,您可以指示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 ~]$
这样你就不必指定哪个服务器的关键function。 它只会使用第一个工作密钥。
如果给定的服务器愿意接受密钥,你也只能input密码。 正如上面看到的,ssh并没有试图为.ssh/id_rsa
请求一个密码,即使它有一个。
当然,它不会像其他答案中的每台服务器configuration一样,但至less不必为所有连接的服务器添加configuration!
foo:~$ssh-add ~/.ssh/xxx_id_rsa
请确保在添加之前对其进行testing:
ssh -i ~/.ssh/xxx_id_rsa username@example.com
如果您遇到任何问题,有时更改文件的安全性有助于:
chmod 0600 ~/.ssh/xxx_id_rsa
我会同意Tuomas关于使用ssh-agent。 我也想添加第二个私人密钥工作, 这个教程对我来说就像一个魅力。
步骤如下:
-
$ ssh-agent bash
-
$ ssh-add /path.to/private/key
例如ssh-add ~/.ssh/id_rsa
$ ssh-add /path.to/private/key
ssh-add ~/.ssh/id_rsa
- 通过
$ ssh-add -l
validation - 用
$ssh -v <host url>
testing它,例如ssh -v git@assembla.com
以前的答案已经正确地解释了如何创build一个configuration文件来pipe理多个ssh密钥。 我认为,还需要解释的重要事情是在克隆存储库时用别名replace主机名 。
假设您的公司的GitHub帐户的用户名是abc1234 。 假设你的个人GitHub帐户的用户名是jack1234
而且,假设您已经创build了两个RSA密钥,即id_rsa_company和id_rsa_personal 。 所以,你的configuration文件如下所示:
# 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.comreplace为我们在configuration文件中定义的别名“company”。
同样,您必须根据configuration文件中提供的别名修改个人帐户中存储库的克隆URL。
-
生成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
-
使用以下内容创buildconfiguration文件
~/.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
在这里看到更多
使用ssh-agent作为你的密钥。
我曾经遇到过这个问题,当时我有两个Bitbucket帐户,并且想要为两者存储单独的SSH密钥。 这是为我工作。
我创build了两个单独的sshconfiguration如下。
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
文件夹中创build一个名为config
的configuration文件。 它可以包含:
Host aws HostName *yourip* User *youruser* IdentityFile *idFile*
这将允许你连接到这样的机器
ssh aws
在运行OpenSSH_5.3p1,OpenSSL 1.0.1e-fips的Centos 6.5上,我通过重命名我的密钥文件来解决这个问题,所以他们都没有默认的名字。 我的.ssh目录包含id_rsa_foo和id_rsa_bar,但没有id_rsa等
重要提示:您必须启动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代理。