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在可能的情况下使用,因为这样就无需为每个远程创建每个目标脚本.
Von*_*onC 29
请注意,从git 2.3+开始(2015年第1季度),您最初尝试的将使用新的环境变量GIT_SSH_COMMAND.
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脚本).
使用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)
以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在这种情况下直接使用。
你可以使用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
请参阅链接了解详情
| 归档时间: |
|
| 查看次数: |
54893 次 |
| 最近记录: |