56

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

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

4

5 回答 5

102

您不能在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尽可能使用,因为这避免了为每个远程创建每个目标脚本的需要。

于 2013-01-08T17:47:17.280 回答
31

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

请参阅Thomas Quinot ( )提交 3994276quinot

git_connect: 设置 ssh shell 命令GIT_SSH_COMMAND

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

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

GIT_SSH_COMMAND

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

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

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

于 2014-12-22T17:44:47.410 回答
8

基于larsk回答VonC回答,您可以创建一个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命令及其额外参数的脚本。这正是 thegit_ssh.sh的全部内容:由于我们已经设置$GIT_SSH_COMMAND为 be /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在这种情况下直接使用。

于 2018-01-01T13:36:47.473 回答
7

使用 ssh 代理

ssh-agent bash -c 'ssh-add /home/me/my_private_key; git clone git@bitbucket.org:uname/test-git-repo.git'
于 2014-05-12T06:52:41.227 回答
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

详情见链接。

于 2013-03-24T10:12:24.177 回答