我有2个Git服务器需要2个不同的SSH密钥。
git clone user1@server1:blahblahblah
使用~/.ssh/id_rsa
,但我需要根据我连接的服务器指定使用哪个密钥。
这个工作有什么Git命令行参数? (我正在运行Linux)
答案 0 :(得分:38)
还有另一种可能性。要设置function myFunction2()
{
return {if (2<4) {5} else {6}};
}
,例如
core.sshCommand
当这个策略特别有用时,有一个特殊的情况:当你在Github上有多个帐户时,因为所有帐户git config --local core.sshCommand "/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo"
到Github都是ssh
并且它使用git@github.com
键确定您是哪个Github用户。在这种情况下,ssh
和.ssh/config
都不会做你想要的。
更新 - 在拥有本地存储库之前无法运行上述内容,因此如果您尝试克隆远程存储库,则需要手动指定密钥根据Guss的回答:
ssh-agent
一旦克隆了存储库,就可以使用GIT_SSH_COMMAND="/usr/bin/ssh -i /home/me/.ssh/id_rsa_foo" git clone https://github.com/user/repo
命令永久地设置它。
答案 1 :(得分:31)
如果您通过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
This article有更多细节。
答案 2 :(得分:29)
通常,您希望使用~/.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
设置为要使用的默认密钥。
答案 3 :(得分:16)
使用ssh-add path-to-private-key
它开箱即用。
答案 4 :(得分:15)
在我的场景中,类似于@Richard Smith场景(其解决方案,BTW,对我来说不起作用),我需要在不同的存储库下为同一台服务器使用不同的密钥。
我的解决方法是使用环境变量GIT_SSH_COMMAND
正确设置会话,如下所示:
export GIT_SSH_COMMAND="ssh -o IdentitiesOnly=yes -i ~/.ssh/my-secret-identitiy"
<强>更新强>:
这里要注意的另一件事是正确设置环境变量可能是一种喧嚣,所以我使用Liquid Prompt或Fish Shell之类的命令提示符修改工具来挂钩shell并根据当前目录和一些规则不断更新环境变量。例如,我需要使用Gitlab的个人SSH密钥的所有个人项目都在~/Documents/Projects/personal
下,所以当shell钩子运行pwd
并发现当前目录在该路径下时,它会自动设置{ {1}}根据需要变量。
答案 5 :(得分:1)
其他答案启发我编写了一个小脚本,该脚本根据命令行选项或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
答案 6 :(得分:0)
第一次(克隆)可以设置--global,克隆后可以设置--global或--local,如果键是每个项目的话,我会选择--local
git config --local --add core.sshCommand'ssh -i 〜/ .ssh / my_key'
答案 7 :(得分:0)
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密钥。对于我来说,这可能不是所有情况的理想解决方案。
答案 8 :(得分:0)
另一种选择是编写一个小的脚本,以使core.sshCommand
更加智能-检查当前工作目录是否配置了特定的SSH密钥,如果使用,请使用它,否则-依赖标准的SSH密钥解析。
这是我的第一个版本:
#!/bin/bash
key="$(git config ssh.key)"
if [ -n "$key" ]; then
ssh -o IdentitiesOnly=yes -i "$key" "$@"
else
ssh "$@"
fi
然后将其设置为 global git SSH命令:
chmod 755 ~/.local/bin/git-ssh-command
git config --global core.sshCommand ~/.local/bin/git-ssh-command
({~/.local/bin
是"place user scripts here" on SystemD operating systems的当前标准)
设置完毕后,可以通过设置配置选项ssh.key
将任何存储库配置为使用特定的SSH密钥:
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")"
来解决正在操作的远程-并进行检查({{ 1}}看起来像$remote
输出中的中间一列。