关于ssh:GIT选择要使用的私钥

GIT select private key to use

我有2个Git服务器需要2个不同的ssh密钥。

git clone user1@server1:blahblahblah使用~/.ssh/id_rsa,但我需要根据连接的服务器指定要使用的密钥。

这个作业使用什么git命令行参数?(我运行的是Linux)


还有另一种可能性。这就是设置core.sshCommand,例如

1
git config --local core.sshCommand"/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo"

当这个策略特别有用时,有一个特定的场景:当您在GitHub上有多个帐户时,所有帐户都是ssh到GitHub作为[email protected],它使用ssh键来确定您是哪个GitHub用户。在这种情况下,.ssh/configssh-agent都不会做你想做的。

更新—在拥有本地存储库之前,您无法运行上述操作,因此如果要克隆远程存储库,则需要根据gus的答案手动指定密钥:

1
GIT_SSH_COMMAND="/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" git clone https://github.com/user/repo

一旦克隆了存储库,就可以使用git config命令永久设置该存储库。


如果您通过ssh连接,那么密钥将由ssh参数控制,而不是由git参数控制。

ssh在~/.ssh/config文件中查找配置参数。修改该文件并为两个git服务器添加IdentityFile条目,如下所示:

1
2
3
4
Host server1.whatever.com
  IdentityFile /path/to/key_1
Host server2.whatever.com
  IdentityFile /path/to/key_2

这篇文章有更多的细节。


一般来说,您需要使用~/.ssh/config来实现这一点。只需将服务器地址与要用于它们的密钥配对,如下所示:

1
2
3
4
5
6
Host github.com
  IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
  IdentityFile ~/.ssh/id_rsa.heroku
Host *
  IdentityFile ~/.ssh/id_rsa

Host *表示任何服务器,所以我使用它将~/.ssh/id_rsa设置为要使用的默认密钥。


使用ssh-add path-to-private-key它是开箱即用的。


在我的场景中,类似于@Richard Smith场景(其解决方案btw不适用于我),我需要为不同存储库下的同一服务器使用不同的密钥。

我的解决方法是使用环境变量GIT_SSH_COMMAND正确设置会话,如下所示:

1
export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy"

更新:

这里要注意的另一件事是,正确设置环境变量可能是一种刺激,因此我使用由liquid prompt或fish shell提供的命令提示符修改工具来钩住shell,并根据当前目录和一些规则不断更新环境变量。例如,我在Gitlab上需要我的个人ssh密钥的所有个人项目都在~/Documents/Projects/personal下,所以当shell钩子运行pwd并发现当前目录在该路径下时,它会根据需要自动设置GIT_SSH_COMMAND变量。


第一次(克隆)您可以设置--全局,克隆之后您可以设置--全局或--本地,如果键是每个项目的,我会选择--本地

git config --local --add core.sshCommand 'ssh -i
~/.ssh/my_key'