如果我把它作为用例来问,这个问题会很简单。我的电脑上有两个SSH密钥
- 个性化_id_rsa
- company_id_rsa
我在bitbucket.org上有两个不同的用户帐户。其中一个是我的个人帐户,另一个是公司帐户。我的电脑上也有N数量的存储库。其中一些必须与我的个人账户链接,其他与公司账户链接。没有必须链接到这两个帐户的存储库。我已将~/.ssh/config
中的Identityfile设置为如下内容。
Host *.bitbucket.org
IdentityFile ~/.ssh/company_id_rsa
每当我想向我的个人转发推送一些东西时,我都会将配置文件更改为如下所示。
Host *.bitbucket.org
IdentityFile ~/.ssh/personal_id_rsa
现在,每当我想制作git push
时,编辑文件会变得非常不便。我只是在想,如果我能在按下时快速拿起其中一把钥匙,那会容易得多。有什么办法吗?
我遇到了这个问题,它解释了一个类似的用例,但这不是确切的用例。
您可以在ssh配置文件中添加两个Bitbucket"帐户"。Bitbucket在443端口上有另一个ssh主机侦听(对于那些几乎屏蔽了所有端口的人(原文如此!))。
Host bitbucketCompany
User git
HostName altssh.bitbucket.org
Port 443
IdentityFile ~/.ssh/company_id_rsa
Host bitbucketWork
User git
HostName bitbucket.org
Port 22
IdentityFile ~/.ssh/personal_id_rsa
然后在.git/config 中更新您的遥控器
公司项目
[remote "origin"]
url = ssh://bitbucketCompany/username/repo.git
个人项目
[remote "origin"]
url = ssh://bitbucketPersonal/username/repo.git
两种方式。
-
Git会参考环境变量
GIT_SSH
来了解要使用哪个SSH客户端。如果未设置,它将恢复为内置默认值(根据平台IIRC的不同,它只是ssh
或ssh.exe
),因此您可以执行以下操作:$ cat >~/bin/bb-priv-ssh #!/bin/sh /usr/bin/ssh -i /path/to/my/private/ssh/key ^D $ chmod +x $_ $ cat >~/bin/bb-corp-ssh #!/bin/sh /usr/bin/ssh -i /path/to/my/corporate/ssh/key ^D $ chmod +x $_
现在你可以做这个了
$ GIT_SSH=~/bin/bb-priv-ssh git push $ GIT_SSH=~/bin/bb-corp-ssh git push
或者只是
$ export GIT_SSH=~/bin/bb-priv-ssh
在你开始私人工作之前;"公司设置"会像这样设置,并进行明显的调整。
请注意,不能只使用
GIT_SSH='/usr/bin/ssh -i /path/to/a/key/file'
,因为Git希望此变量只包含一个路径名。我现在懒得在谷歌上搜索comp.lang.version-control.git
关于这方面的相关文章—如果需要,请自己动手。 -
开始使用SSH密钥代理。然后,您可以向其中添加两个密钥,它将在进行身份验证时尝试同时使用这两个密钥—一个会失败,另一个会成功。这使得不幸的主机的登录过程更长(再进行一轮身份验证往返),但在这种情况下,我认为,为了方便起见,这是一个合理的代价。
解决方案
我将另一个答案保留为已接受的答案,因为这为我指明了正确的解决方案。我从机器上删除了所有现有的密钥,并创建了两个全新的密钥,即personalid
和companyid
。
$ ssh-keygen -f ~/.ssh/personalid -C "My Personal SSH Key"
$ ssh-keygen -f ~/.ssh/companyid -C "My Company SSH Key"
之后,将两者添加到bitbucket上的适当帐户中。然后我创建了下面的SSH config
文件,一切都像一个符咒。由于我没有任何必须推送到公司和个人帐户的存储库,因此此解决方案不需要额外的黑客操作即可使其工作。
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/personalid
Host company
HostName bitbucket.org
IdentityFile ~/.ssh/companyid
Host personal
HostName bitbucket.org
IdentityFile ~/.ssh/personalid
当推送时,像你一样正常操作,git push <your stuff>
,它会选择上传到比特桶上的合适的密钥。