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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用GIT_SSH错误使用自定义SSH进行Git克隆相关的知识,希望对你有一定的参考价值。

我正在尝试使用自定义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

能帮我解决一下这个问题吗?

答案

您无法在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,因为这样就无需为每个远程创建每个目标脚本。

另一答案

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

参见commit 3994276Thomas 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'。 该命令将给出两个或四个参数:

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

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

另一答案

使用ssh-agent

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

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

另一答案

你可以使用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

请参阅链接了解详情

以上是关于使用GIT_SSH错误使用自定义SSH进行Git克隆的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Git for Windows 10 中永久设置 GIT_SSH 变量

Jenkins GIT_SSH组件权限导致build失败的问题。

在 linux 上为 git 私有 SSH 密钥设置自定义路径

GitLab使用自定义端口

ssh登陆github

git一台机器上使用不同的git账号