我正在尝试使用自定义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
你能帮我解决这个问题吗?
答案 0 :(得分: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.
一个选项是使用适当的配置向您的.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
,因为这样就无需为每个遥控器创建每个目标脚本。
答案 1 :(得分:29)
请注意,从git 2.3+开始(2015年第1季度),您最初尝试的内容将使用新的环境变量GIT_SSH_COMMAND
。
请参阅commit 3994276中的Thomas Quinot (quinot
):
git_connect
:在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
'当他们需要连接到远程系统时 该命令将给出两个或四个参数:
- '
username@host
' (或只是'host
')从URL和shell命令在该远程系统上执行,可选地前面有'-p
' (字面意思)和- '
port
'从URL指定除默认SSH
端口以外的其他内容。
$GIT_SSH_COMMAND
优先于$GIT_SSH
,并由shell解释,允许包含其他参数。
另一方面,$GIT_SSH
必须只是程序的路径(如果需要其他参数,可以是包装shell脚本)。
答案 2 :(得分:6)
使用ssh-agent
ssh-agent bash -c 'ssh-add /home/me/my_private_key; git clone git@bitbucket.org:uname/test-git-repo.git'
答案 3 :(得分:6)
在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
。
答案 4 :(得分: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
请参阅链接了解详情。