使用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 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
'。 该命令将给出两个或四个参数:
- 来自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'
在larsk的answer和VonC的answer的基础上,你可以创建一个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失败的问题。