使用GIT_SSH错误使用自定义SSH进行Git克隆

时间:2013-01-08 17:41:07

标签: git ssh environment-variables clone git-clone

我正在尝试使用自定义SSH命令克隆Git仓库。我在GIT_SSH环境中设置SSH命令可变地运行

export GIT_SSH="/usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key"

但是,在上一个命令之后我运行

git clone git@bitbucket.org:uname/test-git-repo.git,我收到以下奇怪的错误

error: cannot run /usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key
fatal: unable to fork

你能帮我解决这个问题吗?

5 个答案:

答案 0 :(得分:98)

您无法在GIT_SSH环境变量中提供选项;来自git手册页:

   GIT_SSH
       If this environment variable is set then git fetch and git push will use this command instead of ssh when they need to connect
       to a remote system. The $GIT_SSH command will be given exactly two arguments: the username@host (or just host) from the URL
       and the shell command to execute on that remote system.

       To pass options to the program that you want to list in GIT_SSH you will need to wrap the program and options into a shell
       script, then set GIT_SSH to refer to the shell script.

一个选项是使用适当的配置向您的.ssh/config文件添加一个节:

Host bitbucket.org
  StrictHostKeyChecking no
  IdentityFile /home/me/my_private_key

另一个选择是将GIT_SSH指向一个执行所需操作的shell脚本。例如,在/home/me/bin/bitbucket_ssh中,放置:

#!/bin/sh
exec /usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key "$@"

然后在GIT_SSH/home/me/bin/bitbucket_ssh

我更喜欢在可能的情况下使用.ssh/config,因为这样就无需为每个遥控器创建每个目标脚本。

答案 1 :(得分:29)

请注意,从git 2.3+开始(2015年第1季度),您最初尝试的内容将使用新的环境变量GIT_SSH_COMMAND

请参阅commit 3994276中的Thomas Quinot (quinot)

git_connect:在GIT_SSH_COMMAND

中设置ssh shell命令
  

当需要传递其他参数时,为GIT_SSH安装包装脚本可能是不切实际的。
  提供另一种指定要运行的shell命令的方法,包括命令行参数,通过GIT_SSH_COMMAND环境变量,其行为类似GIT_SSH传递给shell

     

在使用PuTTY的plink / tortoiseplink时修改参数的特殊电路仅在使用GIT_SSH时激活;在使用GIT_SSH_COMMAND的情况下,在调用底层的ssh实现之前,故意留给用户进行任何必需的参数调整。

GIT_SSH_COMMAND

  

如果设置了这些环境变量中的任何一个,那么' git fetch'和' git push'将使用指定的命令而不是' ssh'当他们需要连接到远程系统时   该命令将给出两个或四个参数:

     
      
  • ' username@host' (或只是' host')从URL和shell命令在该远程系统上执行,可选地前面有' -p' (字面意思)和
  •   
  • ' port'从URL指定除默认SSH端口以外的其他内容。
  •   
     

$GIT_SSH_COMMAND优先于$GIT_SSH,并由shell解释,允许包含其他参数。
  另一方面,$GIT_SSH必须只是程序的路径(如果需要其他参数,可以是包装shell脚本)。

答案 2 :(得分:6)

使用ssh-agent

ssh-agent bash -c 'ssh-add /home/me/my_private_key; git clone git@bitbucket.org:uname/test-git-repo.git'

答案 3 :(得分:6)

larskanswerVonCanswer上构建,您可以创建git_ssh.sh脚本,例如:

#!/bin/sh
# Workaround: GIT_SSH_COMMAND isn't supported by Git < 2.3
exec ${GIT_SSH_COMMAND:-ssh} "$@"

然后像这样调用git命令:

export GIT_SSH_COMMAND="/usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key"
export GIT_SSH=path/to/git_ssh.sh
git ...

这就是它的工作原理:

在Git v2.3中,$GIT_SSH_COMMAND优先于$GIT_SSH,但旧版本根本不尊重$GIT_SSH_COMMAND

$GIT_SSH只能保存系统上ssh命令的路径。它不能将额外的命令行参数传递给该命令,那么我们如何将额外的参数传递给ssh

解决方法是创建一个包含ssh命令及其额外参数的脚本。这正是git_ssh.sh的全部内容:由于我们已将$GIT_SSH_COMMAND设置为/usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key,因此我们需要exec"$@"这里是将Git本身传递给git_ssh.sh的参数传递给$GIT_SSH_COMMAND.

${...:-ssh}部分,虽然不是严格需要的,但它会使$GIT_SSH_COMMAND默认为ssh命令,因此设置GIT_SSH=git_ssh.sh不会破坏正常情况git执行。

作为附加值,Git v2.3 +完全忽略了这个脚本,在这种情况下直接使用$GIT_SSH_COMMAND

答案 4 :(得分:5)

您可以使用Git命令提供您希望使用的任何密钥文件,如下所示:

$ PKEY=~/.ssh/keyfile.pem git clone git@github.com:me/repo.git

或者这个:

$ git.sh -i ~/.ssh/keyfile.pem clone git@github.com:me/repo.git

我在这里回答了同样的问题: https://stackoverflow.com/a/15596980

请参阅链接了解详情。