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

Par*_*ris 54 git ssh clone environment-variables 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
Run Code Online (Sandbox Code Playgroud)

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

lar*_*sks 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.
Run Code Online (Sandbox Code Playgroud)

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

Host bitbucket.org
  StrictHostKeyChecking no
  IdentityFile /home/me/my_private_key
Run Code Online (Sandbox Code Playgroud)

另一个选择是指向GIT_SSH一个执行您想要的shell脚本.例如,放入/home/me/bin/bitbucket_ssh,放:

#!/bin/sh
exec /usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key "$@"
Run Code Online (Sandbox Code Playgroud)

然后指向GIT_SSH/home/me/bin/bitbucket_ssh.

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

  • 我不得不在.ssh/config中使用"IdentityFile"而不是"IdentifyFile" (2认同)

Von*_*onC 29

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

犯3994276托马斯QUINOT( )quinot:

git_connect:在中设置ssh shell命令 GIT_SSH_COMMAND

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中的' username@host'(或只是' host')和要在该远程系统上执行的shell命令,可选地前面加' -p'(字面意思)和
  • port来自URL 的' '指定默认SSH端口以外的其他内容.

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


Tlm*_*aK0 7

使用ssh-agent

ssh-agent bash -c 'ssh-add /home/me/my_private_key; git clone git@bitbucket.org:uname/test-git-repo.git'
Run Code Online (Sandbox Code Playgroud)


Che*_*evy 6

larsk答案VonC答案为基础,您可以创建一个git_ssh.sh脚本,例如:

#!/bin/sh
# Workaround: GIT_SSH_COMMAND isn't supported by Git < 2.3
exec ${GIT_SSH_COMMAND:-ssh} "$@"
Run Code Online (Sandbox Code Playgroud)

然后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 ...
Run Code Online (Sandbox Code Playgroud)

它是这样工作的:

在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_ssh.shGit本身传递的参数传递给的。$GIT_SSH_COMMAND.

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

作为增值,Git v2.3 +完全忽略了此脚本,并且$GIT_SSH_COMMAND在这种情况下直接使用。


alv*_*bad 5

你可以使用Git命令提供你想要使用的任何密钥文件,如下所示:

$ PKEY=~/.ssh/keyfile.pem git clone git@github.com:me/repo.git
Run Code Online (Sandbox Code Playgroud)

或这个:

$ git.sh -i ~/.ssh/keyfile.pem clone git@github.com:me/repo.git
Run Code Online (Sandbox Code Playgroud)

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

请参阅链接了解详情

  • 这个答案令人困惑并且毫无用处,因为人们应该首先点击该链接并创建其中包含的脚本。并且*那些*似乎也被扭曲了,因为(如其他人所示)有一些方法可以使用简单的 git 标准环境变量或 SSH 配置文件来完成 OP 想要的操作。 (2认同)