我有2个Git服务器需要2个不同的ssh密钥。
git clone user1@server1:blahblahblah使用~/.ssh/id_rsa,但我需要根据连接的服务器指定要使用的密钥。
这个作业使用什么git命令行参数?(我运行的是Linux)
- 此问题在superuser.com/questions/232373/hellip;上得到解答。
- 不使用~/.ssh/config为git push指定ssh密钥的可能副本
- 使用或不使用ruby执行shell命令时使用的specify private ssh密钥可能重复?
还有另一种可能性。这就是设置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/config和ssh-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密钥来访问不同的git服务器。不需要修改~/.ssh/config(即使是/etc/hosts,如果GitHub上有多个帐户)。
- 但有一个问题:在配置repo之前不能克隆它,为了配置它,需要先克隆它。或者,您可以在本地配置一个repo,使用正确的ssh命令,然后添加一个远程(3个步骤,相比之下只有1个"git clone")。
- 要克隆repo,我将使用下面的@guss解决方案,通过设置git_ssh_command环境变量。但在正常使用中,我更喜欢我的解决方案,因为它避免了每次启动新shell时都必须重新导出该变量。
- 救命!有很多人演示如何使用/ssh/config来设置它,以及如何使用ssh-agent/ssh-add-k来安装Mac。它已经使用了一年,但突然停止了在有最新补丁的高塞拉地区的工作。当其他一切都失败时,core.sshcommand工作正常。谢谢!
如果您通过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处理授权时,如何给git这个参数?
- @keks:不能通过git命令行传递ssh参数。这个答案提供了一个解决方法。还有其他可能的解决方法,例如git.wiki.kernel.org/index.php/…。注意,该方法也不使用命令行参数来修改ssh行为。
- 是的,但是你最初的回答没有回答这个问题。您也可以使用ssh-agent和ssh-add然后只使用git。当Git通过ssh连接时,密钥已经启用。你看,有几种方法,你最初的答案没有什么帮助。
- 这只是一个链接答案。你能把文章的相关部分总结一下吗?
- @flimm:添加摘要。
一般来说,您需要使用~/.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设置为要使用的默认密钥。
- 如果一台服务器上有多个帐户(如github),并且每个帐户都需要一个不同的私钥,那么这个想法不起作用。
- 对于一台服务器上的多个帐户,请参阅此答案stackoverflow.com/questions/3225862/…
使用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'