GIT选择要使用的私钥

时间:2011-07-14 04:58:22

标签: git ssh

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

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

这个工作有什么Git命令行参数? (我正在运行Linux)

9 个答案:

答案 0 :(得分:38)

还有另一种可能性。要设置function myFunction2() { return {if (2<4) {5} else {6}}; } ,例如

core.sshCommand

当这个策略特别有用时,有一个特殊的情况:当你在Github上有多个帐户时,因为所有帐户git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" 到Github都是ssh并且它使用git@github.com键确定您是哪个Github用户。在这种情况下,ssh.ssh/config都不会做你想要的。

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

ssh-agent

一旦克隆了存储库,就可以使用GIT_SSH_COMMAND="/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" git clone https://github.com/user/repo 命令永久地设置它。

答案 1 :(得分:31)

如果您通过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

This article有更多细节。

答案 2 :(得分:29)

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

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设置为要使用的默认密钥。

答案 3 :(得分:16)

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

答案 4 :(得分:15)

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

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

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

<强>更新

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

答案 5 :(得分:1)

其他答案启发我编写了一个小脚本,该脚本根据命令行选项或git remote -v的值(如果存在)选择ssh键。 希望对您有帮助!

要实际回答这个问题:请使用gat。

另请参阅https://bitbucket.org/eikerobert/gat/src/master/

#!/bin/bash

usegat=false

for VAR in "$@"
do
    if [ "$VAR" != "${VAR/git@bitbucket.org:myaccount/}" ]; then
        usegat=true
    fi
done

if [ $usegat=false ]; then
   /usr/bin/git rev-parse --is-inside-work-tree >/dev/null 2>&1
   isinsidegitrepo=$?
    #echo $isinsidegitrepo
   if [ $isinsidegitrepo = 0 ]; then
       remote=`/usr/bin/git remote -v`
       if [ "$remote" != "${remote/git@bitbucket.org:myaccount/}" ]; then
           usegat=true
       fi
   fi
fi


if [ $usegat = true ]; then
    # echo "TRUE"
    /usr/bin/git -c core.sshCommand="/usr/bin/ssh -i /home/myaccount/.ssh/mykey" "$@"
else
     #echo "FALSE"
    /usr/bin/git "$@"
fi

答案 6 :(得分:0)

第一次(克隆)可以设置--global,克隆后可以设置--global或--local,如果键是每个项目的话,我会选择--local

  

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

答案 7 :(得分:0)

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

以下命令可用于此目的:

git clone -c core.sshCommand="ssh -i ~/.ssh/<PRIVATE KEY NAME>" <CLONE URL>

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

答案 8 :(得分:0)

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

这是我的第一个版本:

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

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

chmod 755 ~/.local/bin/git-ssh-command
git config --global core.sshCommand ~/.local/bin/git-ssh-command

({~/.local/bin"place user scripts here" on SystemD operating systems的当前标准)

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

git config --local ssh.key ~/.ssh/my-non-default-private-key

其他可选技巧

  • 将全局ssh.key设置为具有“默认回退到非默认SSH密钥”之类的东西。
  • 当git在存储库的根目录中执行core.sshCommand时,您的自定义git-ssh-command可以查看该目录并具有有关目录名称的启发式功能。可以在else部分中完成此操作,因此试探法只会在ssh.key中没有特定键的情况下才起作用。
  • 您可以添加git remote -v检查以添加基于遥控器的启发式功能,例如在Eike的脚本中
  • 如果您要查看存储库远程,但有多个需要不同键的远程,则可以在脚本开头添加remote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"来解决正在操作的远程-并进行检查({{ 1}}看起来像$remote输出中的中间一列。