将ssh选项传递给git clone


103

我试图在git clone不使用ssh检查存储库主机密钥的情况下运行。我可以这样从ssh做到这一点:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@host

有什么办法可以将相同的ssh选项传递给git clone命令?

编辑:有一个限制,我不能修改~/.ssh/config该机器上的任何其他文件。


2
您尝试执行的操作非常冒险,您可能不应该这样做。如果在大多数情况下远程SSH服务器的身份不是一个好主意,则禁用验证。您可以有效地禁用通过使用SSH获得的所有安全性,并使自己容易受到中间人攻击。
AEF

1
实际上,这通常正是您想要执行的操作。您有一个内部仓库。如果有人设法欺骗了您,那您就麻烦了。它根本不是“非常冒险”的。实际上,您多久对主机密钥进行一次带外检查?(你应该)。
格雷厄姆·尼科尔斯

Answers:


47

将它们添加到您的~/.ssh/config

Host host
    HostName host
    User user
    SshOption1 Value1
    SshOption2 Value2

Host条目是您将在命令行上指定的,并且HostName是真实的主机名。它们可以相同,或者Host条目可以是别名。User如果您未user@在命令行上指定,则使用该条目。

如果必须在命令行上配置它,请将GIT_SSH环境变量设置为指向包含选项的脚本。


4
我忘了说我不能在那台机器上修改任何文件。否则,您的解决方案将起作用。
丹尼尔(Daniel)

28
使用GIT_SSH环境变量。
李乔(Josh Lee)

151

最近发布的git 2.3支持新变量“ GIT_SSH_COMMAND”,可用于定义带有参数的命令。

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@host

$GIT_SSH_COMMAND优先于$GIT_SSH,并由外壳程序解释,该外壳程序允许包含其他参数。


应该在前面换行git clone还是代码正确?
托马什Zato -恢复莫妮卡

7
这应该是正确的,没有换行符,应为以下命令设置变量。如果添加换行符,则需要导出变量,那么它也应该起作用。
鲍里斯

谢谢,我已经坚持了2天!
James Gentes

ya!谢谢。
贾斯珀·布鲁斯

我认为它不适用于git 1.9版本,是否有git 1.9的替代解决方案
lazarus

33

指定不同键的另一个选项是git config core.sshCommandgit 2.10 +(2016年第三季度)。

这是Boris答案中描述的环境变量的替代方法)

提交3c8ede3通过(2016年6月26日)阮泰玉维战(pclouds
(通过合并JUNIOÇ滨野- gitster-提交dc21164 7月19日2016)

core.sshCommand添加了新的配置变量,以指定GIT_SSH_COMMAND每个存储库使用的值。

$GIT_ASKPASS或类似$GIT_PROXY_COMMAND,我们也首先从配置文件中读取,然后回落至$GIT_SSH_COMMAND

这对于选择针对同一主机的不同私钥很有用(例如github)

core.sshCommand:

如果设置了此变量,git fetch并将在需要连接到远程系统时git push使用指定的命令代替ssh
该命令与GIT_SSH_COMMAND环境变量的格式相同,并且在设置环境变量时将被覆盖。

这意味着git clone可以是:

cd /path/to/my/repo
git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' 
# later on
git clone host:repo.git

如果要将其应用于所有存储库,如user1300959 在注释中添加,则将使用全局配置。

git config --global core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

2
您很有可能没有回购协议,因为您有git clone-在这种情况下,您可能需要全局配置git ssh命令:git config --global core.sshCommand ...
iurii

@ user1300959好点,谢谢。我已将您的评论包含在答案中,以提高知名度。
VonC

这是最好的答案。
MikeSchinkel '18

在最后一部分,您缺少撇号
Luigi Lopez

@LuigiLopez您可以编辑答案吗?我将审查您的修改。
VonC

21

这是一个棘手的示例,该示例如何使用GIT_SSH变量传递ssh参数:

$ echo 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH="$PWD/ssh" git clone user@host

注意:以上几行是终端命令行,您应该将其粘贴到终端中。它将创建一个文件ssh,使其可执行并执行。

如果您想通过私钥选项,请选中如何告诉git使用哪个私钥?


真好!问:两个$*"$@"似乎工作。通常我使用"$@",因为另一个似乎已弃用。$*在这种情况下,有理由优先吗?
mh8020

16

存储库级别配置,而不会影响系统级别设置

合并现有的答案,我选择以下步骤。这样可以确保配置更改不会对计算机级别产生影响,而只会影响正在使用的存储库。就我而言,这是必需的,因为我的脚本需要在共享的Bamboo代理上执行。

1.采用此GIT_SSH_COMMAND方法克隆存储库。

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone ssh://url

2.克隆后,导航到存储库目录。

cd repo-dir

3.设置core.sshCommand配置,以便将来所有的调用都可以像通常一样使用git命令运行,但在内部使用提供的git选项。

git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

1
core.sshCommand我在上面提到的很好用。已投票。
VonC

5

我认为将git更新到> = 2.3并使用GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@host是赌注选项,但如果不可能,@ josh-lee提供了一个不错的选择,但请更新您的缩进ssh配置文件的答案。

Host host
    HostName host
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

0

通过在Window机器中执行以下步骤已解决了此问题:-

  • 在C:\ Users \ username.ssh文件夹下创建配置文件。

  • 将以下行添加到配置文件。

    host <HOST>
    hostname <HOSTNAME>
    user <USER_NAME>
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    port <PORT_NUMBER>
    KexAlgorithms +diffie-hellman-group1-sha1
    
  • 然后再试一次。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.