为给定的域指定一个SSH密钥用于git push

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

(除此之外:gitolite根据密钥区分谁在推送,所以从访问权限,所有权和审计angular度来看,并不是一个问题,即user @ serverstring对于不同的用户来说是相同的)。

即使用户和主机是相同的,他们仍然可以在~/.ssh/config区分。 例如,如果你的configuration如下所示:

 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文件,则它们将首先被尝试,因为与其他configuration选项(遵守“first in wins”)不同, IdentityFile选项附加到身份列表以尝试。 请参阅: https : //serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807

Mark Longair上面提供的另一种方法是使用一个别名,它将在任何远程服务器上运行任何 git命令,并使用另一个SSH密钥。 这个想法基本上是在运行git命令时切换你的SSH身份。

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

  • 将使用任何 git命令或别名,即使您不能显式指定remote
  • 更容易与许多存储库一起工作,因为您只需要在每台客户端机器上设置一次,而不是在每台客户端机器上的每个存储库中设置一次。

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

 git admin push 

使用替代(“admin”)SSH密钥推送到默认远程。 再次,你可以使用这个别名的任何命令(不只是push )。 你甚至可以做git admin clone ...克隆你只能使用你的“pipe理员”键访问的存储库。

第一步:创build另一个SSH密钥,可select设置一个密码,以防在别人的机器上这样做。

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

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

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

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

第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/

另一种方法是使用ssh-ident来pipe理你的ssh身份 。

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

我在Win7上使用Git Bash。 以下为我工作。

在〜/ .ssh / config或c:/ users / [your_user_name] /。ssh / config中创buildconfiguration文件。 在文件中input:

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

我想主机必须是一个URL,而不只是一个“名称”或参考你的主机。 例如,

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

path也可以写成/ c / users / [user_name] / ….格式

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

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

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

这很烦人。 你可以在你的$ HOME / .bash_profile中join以下几行: ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa

所以每次你使用ssh或者git或者scp (基本上都是ssh ),你不必再使用选项-i了。

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

你可以使用git环境variablesGIT_SSH_COMMAND 。 在你的git仓库下运行这个:

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

~/.ssh/your_private_keyreplace为您要使用的ssh私钥的path。 你可以改变后续的git命令(例如git submodule update --init )给其他人,比如git pullgit fetch等等

如果在Windows上使用Git的ssh版本,那么ssh config中的标识文件行看起来就像

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

其中/c是为c:

检查,在混帐的bash做

 cd ~/.ssh pwd 

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