【问题标题】:Git clone with custom SSH using GIT_SSH error使用 GIT_SSH 错误的自定义 SSH 克隆 Git
【发布时间】:2012-12-22 15:45:46
【问题描述】:

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

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

【问题讨论】:

  • 如果在提示符中运行/usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key 会发生什么?
  • 它显示使用信息,因为我没有提供用户名和主机。如果我提供,我就会被拒绝(这是意料之中的)
  • Git 2.3+(2015 年第一季度)将允许更完整的 ssh 命令定义(使用新的环境变量 GIT_SSH_COMMAND)。见my answer below

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


【解决方案1】:

您不能在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,因为这样可以避免为每个远程创建每个目标的脚本。

【讨论】:

  • 我必须在 .ssh/config 中使用“IdentityFile”而不是“IdentifyFile”
  • 我写的 .ssh/config 有问题,我必须删除冒号,使行 Host bitbucket.org
  • 这确实是一个错字。谢谢!
  • 你拯救了我的一天!非常感谢
【解决方案2】:

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

Thomas Quinot (quinot) 看到commit 3994276

git_connect:在GIT_SSH_COMMAND 中设置 ssh shell 命令

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

在使用PuTTY的plink/tortoiseplink的情况下修改参数的特殊电路只有在使用GIT_SSH时才会激活;在使用GIT_SSH_COMMAND的情况下,故意让用户在调用底层ssh实现之前进行任何所需的参数适配。

GIT_SSH_COMMAND:

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

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

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

【讨论】:

    【解决方案3】:

    基于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,而"$@" 就是在这里传递传递给@ 的参数987654341@ 由 Git 自己发送到$GIT_SSH_COMMAND.

    ${...:-ssh} 部分虽然不是必需的,但它是一个很好的接触,它将使 $GIT_SSH_COMMAND 默认为 ssh 命令,因此设置 GIT_SSH=git_ssh.sh 不会破坏正常的 git 执行。

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

    【讨论】:

    • 不错的解决方法,适用于那些使用旧 Git 的环境。 +1
    【解决方案4】:

    使用 ssh 代理

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

    【讨论】:

    • ssh_askpass 也被调用以进行主机密钥验证。
    【解决方案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

    查看链接了解详情。

    【讨论】:

    • 这个答案令人困惑并且毫无用处,因为人们应该首先点击该链接并创建其中包含的脚本。并且 那些 似乎也被扭曲了,因为(正如其他人所展示的那样)有一些方法可以使用简单的 git 标准环境变量或 SSH 配置文件来完成 OP 想要的操作。
    猜你喜欢
    • 1970-01-01
    • 2013-08-07
    • 2020-03-20
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    相关资源
    最近更新 更多