我有以下用例:我希望能够使用用户 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 回答
如果使用Git的版本Windows上的ssh,ssh配置中的标识文件行看起来像
/c
适用于c:
要检查一下,在git的bash中
我在Win7上使用Git Bash . 以下对我有用 .
在〜/ .ssh / config或c:/ users / [your_user_name] / .ssh / config创建配置文件 . 在文件中输入:
我想主机必须是一个URL,而不仅仅是主机的“名称”或参考号 . 例如,
该路径也可以用/ c / users / [user_name] / ....格式编写
Giordano Scalzo提供的解决方案也很棒 . https://stackoverflow.com/a/9149518/1738546
即使用户和主机相同,它们仍然可以在
~/.ssh/config
中区分 . 例如,如果您的配置如下所示:然后你只需使用
gitolite-as-alice
和gitolite-as-bob
而不是URL中的主机名:注意
您希望包含选项
IdentitiesOnly yes
以防止使用默认ID . 否则,如果您还有与默认名称匹配的id文件,它们将首先尝试,因为与其他配置选项(遵守"first in wins")不同,IdentityFile
选项 appends 到要尝试的身份列表 . 见:https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807one offered above by Mark Longair的另一种方法是使用一个别名,该别名将使用备用SSH密钥在任何远程上运行任何git命令 . 这个想法基本上是在运行git命令时切换SSH身份 .
在另一个答案中相对于主机别名方法的优点:
即使您无法明确指定
remote
,也可以使用任何git命令或别名 .更容易使用多个存储库,因为您只需要为每个客户端计算机设置一次,而不是每个客户端计算机上的每个存储库设置一次 .
我使用了一些小脚本和一个git别名
admin
. 我可以这样做,例如:使用备用("admin")SSH密钥推送到默认远程 . 同样,您可以使用此别名的任何命令(不仅仅是
push
) . 您甚至可以使用git admin clone ...
来克隆您只能使用"admin"键访问的存储库 .Step 1: 创建备用SSH密钥,可选择设置密码以防're doing this on someone else' s机器 .
Step 2: 创建一个名为“ssh-as.sh”的脚本,它运行使用SSH的东西,但使用给定的SSH密钥而不是默认密钥:
Step 3: 创建一个名为“git-as.sh”的脚本,该脚本使用给定的SSH密钥运行git命令 .
Step 4: 添加别名(使用适合下面“PATH_TO_SCRIPTS_DIR”的内容):
更多详情:http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/
您可以使用git环境变量
GIT_SSH_COMMAND
. 在您的git存储库下的终端中运行:将
~/.ssh/your_private_key
替换为您要使用的ssh私钥的路径 . 并且您可以将后续git命令(在示例中为git submodule update --init
)更改为其他类似git pull
,git fetch
等 .另一种方法是使用ssh-ident, to manage your ssh identities .
它会根据您当前的工作目录,ssh选项等自动加载和使用不同的密钥......这意味着您可以轻松地拥有一个工作/目录和私有/目录,透明地使用不同的密钥和身份使用ssh .
一个基于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_profile :
ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa
因此,每次使用
ssh
或git
或scp
(基本上也是ssh
)时,您不必再使用选项-i
.您可以在文件 $HOME/.bash_profile 中添加任意数量的键 .
您可能需要删除(或注释掉)默认主机配置