为给定的域指定一个SSH密钥用于git push
我有以下使用案例:我想能够使用gitolite-admin
用户的私钥推送到git@git.company.com:gitolite-admin
gitolite-admin
,而我想推送到git@git.company.com:some_repo
使用“我自己的”私钥。 AFAIK,我无法使用~/.ssh/config
来解决这个问题,因为在这两种情况下用户名和服务器名是相同的。 由于我主要使用自己的私钥,所以在~/.ssh/config
为git@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-alice
和gitolite-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_key
replace为您要使用的ssh私钥的path。 你可以改变后续的git命令(例如git submodule update --init
)给其他人,比如git pull
, git fetch
等等
如果在Windows上使用Git的ssh版本,那么ssh config中的标识文件行看起来就像
IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice
其中/c
是为c:
检查,在混帐的bash做
cd ~/.ssh pwd
您可能需要删除(或注释掉)默认主机configuration