如果我把它作为一个用例来问,这个问题会很简单。我的计算机上有两个 SSH 密钥
我在 bitbucket.org 上有两个不同的用户帐户。其中一个是我的个人帐户,另一个是我的公司帐户。我的 PC 上也有 N 个存储库。其中一些必须与我的个人帐户链接,而其他一些存储库必须与公司帐户链接。没有必须链接到这两个帐户的存储库。我已将 ~/.ssh/config
内的
Identityfile设置为如下所示。
Host *.bitbucket.org
IdentityFile ~/.ssh/company_id_rsa
每当我想将某些内容推送到我的个人存储库时,我都会将配置文件更改为如下所示。
Host *.bitbucket.org
IdentityFile ~/.ssh/personal_id_rsa
而现在,每当我想要制作
git push
时,编辑文件就变得相当不便。我只是在想,如果我可以即时拿起其中一个钥匙,当我push时,事情会容易得多。有什么办法可以做到吗?
我遇到了this问题,它解释了类似的用例,但这不是这里的确切用例。
您可以在 ssh 配置文件中添加两个 Bitbucket“帐户”。 Bitbucket 有替代 ssh 主机侦听端口 443(对于那些封锁了几乎所有端口(原文如此!)的人)。
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 客户端。如果未设置,它将恢复为内置默认值(只是 ssh
或 ssh.exe
,具体取决于平台,IIRC),因此您可以执行以下操作:
$ 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>
,它会选择上传到 bitbucket 上的适当密钥。
你的 git 配置文件应该是这样的,更改你的邮件和主机:
# Set up SSH keys for personal and work projects
Host gitlab.com
HostName gitlab.com
User git
AddKeysToAgent yes
IdentitiesOnly yes
# Personal projects
Match User [email protected]
IdentityFile ~/.ssh/id_ed25519
# Work projects
Match User [email protected]
IdentityFile ~/.ssh/id_rsa