在同一个Git主机上为不同的帐户使用不同的SSH密钥



如果我把它作为用例来问,这个问题会很简单。我的电脑上有两个SSH密钥

  1. 个性化_id_rsa
  2. 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的不同,它只是sshssh.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密钥代理。然后,您可以向其中添加两个密钥,它将在进行身份验证时尝试同时使用这两个密钥—一个会失败,另一个会成功。这使得不幸的主机的登录过程更长(再进行一轮身份验证往返),但在这种情况下,我认为,为了方便起见,这是一个合理的代价。

解决方案

我将另一个答案保留为已接受的答案,因为这为我指明了正确的解决方案。我从机器上删除了所有现有的密钥,并创建了两个全新的密钥,即personalidcompanyid

$ 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>,它会选择上传到比特桶上的合适的密钥。

最新更新