GIT选择要使用的私钥

use*_*302 59 git ssh

我有2个Git服务器,需要2个不同的SSH密钥.

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

什么Git命令行参数完成这项工作?(我正在运行Linux)

Ric*_*ith 53

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

git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo"
Run Code Online (Sandbox Code Playgroud)

当这个策略特别有用的时候有一个特殊情况:那就是当你在Github上拥有多个帐户时,因为所有帐户都是sshGithub,git@github.com并且它使用ssh密钥来确定你是哪个Github用户.在这种情况下,既.ssh/config不会也ssh-agent不会做你想要的.

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

GIT_SSH_COMMAND="/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" git clone https://github.com/user/repo
Run Code Online (Sandbox Code Playgroud)

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

  • 这应该是选定的答案。所需的配置很好地本地化在需要使用不同 ssh 密钥来访问不同 git 服务器的存储库中。无需修改 ~/.ssh/config(甚至 /etc/hosts,以防 GitHub 上有多个帐户)。 (11认同)
  • 要克隆repo,我将通过设置GIT_SSH_COMMAND环境变量使用下面的@Guss解决方案.但在正常使用中我更喜欢我的解决方案,因为它避免了每次启动新shell时都必须重新导出该变量. (3认同)
  • 感谢您提供这个优雅的解决方案。不过我只是想精确说明 core.sshCommand 仅适用于 [git >= 2.10.0](https://github.com/git/git/blob/master/Documentation/RelNotes/2.10.0.txt#L83 ) (3认同)

Cam*_*ner 40

如果您通过SSH连接,则密钥将由SSH参数控制,而不是git参数.

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

Host server1.whatever.com
  IdentityFile /path/to/key_1
Host server2.whatever.com
  IdentityFile /path/to/key_2
Run Code Online (Sandbox Code Playgroud)

本文有更多细节.

  • 这是事实,但是你的原始答案没有回答这个问题.你也可以使用`ssh-agent`并使用`ssh-add`然后只使用git.当git通过ssh连接时,密钥已经启用.你看,有几种方法,你原来的答案并没有真正帮助. (11认同)
  • 那没有回答这个问题.问题是,当ssh处理授权时,如何给git这个参数? (8认同)
  • 这几乎是一个仅链接的答案。您能在回答中总结一下文章的相关部分吗? (2认同)
  • 这个答案已经过时了。 (2认同)

Zaz*_*Zaz 31

通常,您想要使用~/.ssh/config此功能.只需将服务器地址与您要使用的密钥配对,如下所示:

Host github.com
  IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
  IdentityFile ~/.ssh/id_rsa.heroku
Host *
  IdentityFile ~/.ssh/id_rsa
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您在一台服务器上有多个帐户(如GitHub),并且您希望每个帐户都有不同的私钥,则此想法不起作用. (6认同)
  • 对于一台服务器上的多个帐户,请参阅此答案http://stackoverflow.com/questions/3225862/multiple-github-accounts-ssh-config (2认同)

khe*_*lll 17

使用ssh-add path-to-private-key它开箱即用.

  • 如果您有两个部署密钥,并且它们仅适用于某些存储库,则不会。在这种情况下,它可能使用了错误的密钥,并说您没有访问权限。 (2认同)

Gus*_*uss 17

在我的场景中,类似于@Richard Smith场景(其解决方案,BTW,对我来说不起作用),我需要在不同的存储库下为同一台服务器使用不同的密钥.

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

export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy"
Run Code Online (Sandbox Code Playgroud)

更新:

这里要注意的另一件事是正确设置环境变量可能是一个喧嚣,所以我使用像Liquid Shell的Liquid Prompt提供的命令提示修改工具挂钩到shell并继续根据环境变量更新当前目录和一些规则.例如,~/Documents/Projects/personal当我的shell钩子运行pwd并且发现当前目录在该路径下时,我需要使用Gitlab的个人SSH密钥的所有个人项目都是如此,它会GIT_SSH_COMMAND根据需要自动设置变量.


Mao*_*dok 11

您可以设置 --global 或 --local 配置,全局将更新~/.gitconfig文件,本地将更新存储库中的配置.git/config并覆盖全局(~/.gitconfig)配置

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

  • 作为一种魅力,这正是我所需要的,一个特定回购的解决方案。 (2认同)

小智 11

这里的 Windows 用户,我刚刚遇到了这个问题并且有一个稍微不同的解决方案,然后我在这里阅读到目前为止。我面临的问题是,我只想使用特定的私有 ssh 密钥克隆一个存储库,而不必像在 PowerShell 中工作那样全局配置我的 git 配置或添加特定的 git bash 设置。本质上,我只想在我的 .ssh 文件夹中放置一些私钥,并根据需要在特定的存储库中引用它们。

以下命令适用于此:

git clone -c core.sshCommand="ssh -i ~/.ssh/<PRIVATE KEY NAME>" <CLONE URL>
Run Code Online (Sandbox Code Playgroud)

本质上这是在 git repo 的初始化时它在运行克隆之前设置 core.sshCommand 选项。因此,您希望用于此存储库的特定 ssh 密钥仅为此存储库设置。这可能不是所有情况下的理想解决方案,但对于我想要的。


Gus*_*uss 5

另一种选择是编写一个小脚本以使其core.sshCommand更智能 - 检查当前工作目录是否配置了特定的 SSH 密钥,如果是,则使用它,否则 - 依赖标准 SSH 密钥解析。

这是我的第一个版本:

#!/bin/bash
key="$(git config ssh.key)"
if [ -n "$key" ]; then
        ssh -o IdentitiesOnly=yes -i "$key" "$@"
else
        ssh "$@"
fi
Run Code Online (Sandbox Code Playgroud)

然后将其设置为全局git SSH 命令:

chmod 755 ~/.local/bin/git-ssh-command
git config --global core.sshCommand ~/.local/bin/git-ssh-command
Run Code Online (Sandbox Code Playgroud)

(是SystemD 操作系统上“在此处放置用户脚本”~/.local/bin的当前标准)

设置完成后,您可以通过设置配置选项将任何存储库配置为使用特定的 SSH 密钥ssh.key

git config --local ssh.key ~/.ssh/my-non-default-private-key
Run Code Online (Sandbox Code Playgroud)

额外的可选技巧

  • 将全局设置ssh.key为“默认回退到非默认 SSH 密钥”或其他内容。
  • 当 gitcore.sshCommand在存储库的根目录中执行时,您的自定义git-ssh-command可以查看它并对目录名称有一些启发。这可以在 部分中完成else,因此只有在 中没有特定键时启发式才会启动ssh.key
  • 您可以添加git remote -v检查以添加基于遥控器的启发式方法,就像在 Eike 的脚本中一样
  • 如果您想查看存储库遥控器,但有多个需要不同密钥的遥控器,您可以remote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"在脚本的开头添加以解析正在操作的遥控器 - 并进行检查($remote看起来像输出中的中间列git remote -v)。

更新:

这是自定义 SSH 命令的一个版本,它查看远程 URL 并执行一些启发式操作 - 就我而言,我有多个不同的身份,具有相同的公共 git 托管服务(一个用于工作,一个用于个人等),我可以选择通过查看远程 URL 来确定正确的身份(检查 Gitlab 组或 Github 组织等):

chmod 755 ~/.local/bin/git-ssh-command
git config --global core.sshCommand ~/.local/bin/git-ssh-command
Run Code Online (Sandbox Code Playgroud)