我有2个需要2个不同SSH密钥的Git服务器。
git clone user1@server1:blahblahblah
使用~/.ssh/id_rsa
,但是我需要根据要连接的服务器指定要使用的密钥。
这个工作需要什么Git命令行参数?(我正在运行Linux。)
我有2个需要2个不同SSH密钥的Git服务器。
git clone user1@server1:blahblahblah
使用~/.ssh/id_rsa
,但是我需要根据要连接的服务器指定要使用的密钥。
这个工作需要什么Git命令行参数?(我正在运行Linux。)
Answers:
如果您通过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
本文有更多详细信息。
ssh-agent
和使用ssh-add
,然后仅使用git。当git通过ssh连接时,该密钥已启用。您会发现有几种方法,您的原始答案并没有真正的帮助。
还有另一种可能性。那是要设置的core.sshCommand
,例如
git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo"
在一种特定的情况下,该策略特别有用:那就是当您在Github上拥有多个帐户时,因为Github的所有帐户ssh
都存在,git@github.com
并且它使用ssh
密钥来确定您是哪个Github用户。在这种情况下,您.ssh/config
也ssh-agent
不会做您想做的事情。
更新—在拥有本地存储库之前,不能运行上述操作,因此,如果您要克隆远程存储库,则需要根据drewbie18的答案手动指定密钥:
git clone -c core.sshCommand="/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" git@github.com:me/repo.git
克隆存储库后,可以使用git config
命令将其永久设置。
git init
进行回购,在本地对其进行配置以使用正确的ssh命令,然后添加一个远程(3个步骤,“ git clone”只有1个步骤)。
通常,您要为此使用~/.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
为要使用的默认密钥。
在我的方案中,类似于@Richard Smith方案(其解决方案BTW对我不起作用),我需要在不同存储库下的同一服务器上使用不同的密钥。
我的解决方法是使用环境变量正确设置会话GIT_SSH_COMMAND
,如下所示:
export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy"
更新:
这里要注意的另一件事是正确设置环境变量可能会很麻烦,因此我使用的是液体提示或鱼壳之类的东西提供的命令提示符修改功能。来挂接到shell并继续根据环境变量更新环境变量。当前目录和一些规则。例如,我所有需要使用Gitlab使用我的个人SSH密钥的个人项目都在下面,~/Documents/Projects/personal
因此当shell挂钩运行pwd
并发现当前目录在该路径下时,它将GIT_SSH_COMMAND
根据需要自动设置变量。
您可以设置--global或--local配置,global将更新~/.gitconfig
文件,local将更新存储库中的配置.git/config
并覆盖全局(〜/ .gitconfig)配置
git config --local --add core.sshCommand'ssh -i〜/ .ssh / my_key'
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密钥。对于我来说,这可能不是适用于所有情况的理想解决方案。
-c
选择git clone
。这比我在克隆时建议的环境更好。
其他答案启发我编写了一个小脚本,该脚本根据命令行选项或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
另一种选择是编写一个小的脚本来 core.sshCommand
变得更聪明-检查当前工作目录是否配置了特定的SSH密钥,如果使用,请使用它,否则-依靠标准SSH密钥解析。
这是我的第一个版本:
#!/bin/bash
key="$(git config ssh.key)"
if [ -n "$key" ]; then
ssh -o IdentitiesOnly=yes -i "$key" "$@"
else
ssh "$@"
fi
然后将其设置为全局git SSH命令:
chmod 755 ~/.local/bin/git-ssh-command
git config --global core.sshCommand ~/.local/bin/git-ssh-command
(~/.local/bin
是SystemD操作系统上“在此处放置用户脚本”的当前标准)
设置完成后,您可以通过设置配置选项将任何存储库配置为使用特定的SSH密钥ssh.key
:
git config --local ssh.key ~/.ssh/my-non-default-private-key
ssh.key
为具有“默认回退到非默认SSH密钥”或类似内容。core.sshCommand
在存储库的根目录中执行时,您的自定义项git-ssh-command
可以查看该目录并具有有关目录名称的启发式功能。这可以在本else
节中完成,因此启发式仅在没有特定键的情况下才起作用ssh.key
。git remote -v
检查以根据遥控器添加启发式方法,就像在Eike的脚本中一样remote="$1:$(sed "s,.* ,,;s,',,g"<<<"$2")"
在脚本的开头添加以解决正在操作的远程-并进行检查($remote
看起来像git remote -v
输出中的中间列)。