首页 文章

为给定域指定git push的SSH密钥

提问于
浏览
292

我有以下用例:我希望能够使用用户 gitolite-admin 的私钥推送到 git@git.company.com:gitolite-admin ,而我想使用'my own'私钥推送到 git@git.company.com:some_repo . AFAIK,我无法使用 ~/.ssh/config 来解决这个问题,因为在这两种情况下用户名和服务器名都是相同的 . 因为我主要使用自己的私钥,所以我在 ~/.ssh/config 中定义了 git@git.company.com . 有没有人知道一种方法来覆盖用于单个 git 调用的密钥?

(旁白:gitolite基于密钥来区分谁在进行推送,因此在访问,所有权和审计方面,用户@服务器字符串对于不同的用户来说是相同的 . )

8 回答

  • 26

    如果使用Git的版本Windows上的ssh,ssh配置中的标识文件行看起来像

    IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice
    

    /c 适用于 c:

    要检查一下,在git的bash中

    cd ~/.ssh
    pwd
    
  • 10

    我在Win7上使用Git Bash . 以下对我有用 .

    在〜/ .ssh / config或c:/ users / [your_user_name] / .ssh / config创建配置文件 . 在文件中输入:

    Host your_host.com
         IdentityFile [absolute_path_to_your_.ssh]\id_rsa
    

    我想主机必须是一个URL,而不仅仅是主机的“名称”或参考号 . 例如,

    Host github.com
         IdentityFile c:/users/[user_name]/.ssh/id_rsa
    

    该路径也可以用/ c / users / [user_name] / ....格式编写

    Giordano Scalzo提供的解决方案也很棒 . https://stackoverflow.com/a/9149518/1738546

  • 524

    即使用户和主机相同,它们仍然可以在 ~/.ssh/config 中区分 . 例如,如果您的配置如下所示:

    Host gitolite-as-alice
      HostName git.company.com
      User git
      IdentityFile /home/whoever/.ssh/id_rsa.alice
      IdentitiesOnly yes
    
    Host gitolite-as-bob
      HostName git.company.com
      User git
      IdentityFile /home/whoever/.ssh/id_dsa.bob
      IdentitiesOnly yes
    

    然后你只需使用 gitolite-as-alicegitolite-as-bob 而不是URL中的主机名:

    git remote add alice git@gitolite-as-alice:whatever.git
    git remote add bob git@gitolite-as-bob:whatever.git
    

    注意

    您希望包含选项 IdentitiesOnly yes 以防止使用默认ID . 否则,如果您还有与默认名称匹配的id文件,它们将首先尝试,因为与其他配置选项(遵守"first in wins")不同, IdentityFile 选项 appends 到要尝试的身份列表 . 见:https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807

  • 54

    one offered above by Mark Longair的另一种方法是使用一个别名,该别名将使用备用SSH密钥在任何远程上运行任何git命令 . 这个想法基本上是在运行git命令时切换SSH身份 .

    在另一个答案中相对于主机别名方法的优点:

    • 即使您无法明确指定 remote ,也可以使用任何git命令或别名 .

    • 更容易使用多个存储库,因为您只需要为每个客户端计算机设置一次,而不是每个客户端计算机上的每个存储库设置一次 .

    我使用了一些小脚本和一个git别名 admin . 我可以这样做,例如:

    git admin push
    

    使用备用("admin")SSH密钥推送到默认远程 . 同样,您可以使用此别名的任何命令(不仅仅是 push ) . 您甚至可以使用 git admin clone ... 来克隆您只能使用"admin"键访问的存储库 .

    Step 1: 创建备用SSH密钥,可选择设置密码以防're doing this on someone else' s机器 .

    Step 2: 创建一个名为“ssh-as.sh”的脚本,它运行使用SSH的东西,但使用给定的SSH密钥而不是默认密钥:

    #!/bin/bash
    exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "$@"
    

    Step 3: 创建一个名为“git-as.sh”的脚本,该脚本使用给定的SSH密钥运行git命令 .

    #!/bin/bash
    SSH_KEYFILE=$1 GIT_SSH=${BASH_SOURCE%/*}/ssh-as.sh exec git "${@:2}"
    

    Step 4: 添加别名(使用适合下面“PATH_TO_SCRIPTS_DIR”的内容):

    # Run git commands as the SSH identity provided by the keyfile ~/.ssh/admin
    git config --global alias.admin \!"PATH_TO_SCRIPTS_DIR/git-as.sh ~/.ssh/admin"
    

    更多详情:http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/

  • 8

    您可以使用git环境变量 GIT_SSH_COMMAND . 在您的git存储库下的终端中运行:

    GIT_SSH_COMMAND='ssh -i ~/.ssh/your_private_key' git submodule update --init
    

    ~/.ssh/your_private_key 替换为您要使用的ssh私钥的路径 . 并且您可以将后续git命令(在示例中为 git submodule update --init )更改为其他类似 git pullgit fetch 等 .

  • 3

    另一种方法是使用ssh-ident, to manage your ssh identities .

    它会根据您当前的工作目录,ssh选项等自动加载和使用不同的密钥......这意味着您可以轻松地拥有一个工作/目录和私有/目录,透明地使用不同的密钥和身份使用ssh .

  • 10

    一个基于Unix的系统(Linux,BSD,Mac OS X),默认标识存储在目录 $HOME/.ssh 中的2个文件中: private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub 当您使用 ssh 而没有选项 -i 时,它使用默认私钥对远程系统进行身份验证 .

    如果您有另一个要使用的私钥,例如 $HOME/.ssh/deploy_key ,则必须使用 ssh -i ~/.ssh/deploy_key ...

    这很烦人 . 您可以将以下行添加到 $HOME/.bash_profilessh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa

    因此,每次使用 sshgitscp (基本上也是 ssh )时,您不必再使用选项 -i .

    您可以在文件 $HOME/.bash_profile 中添加任意数量的键 .

  • 3

    您可能需要删除(或注释掉)默认主机配置
    .ssh/config

相关问题