Git клон с пользовательским SSH с использованием ошибки git SSH

Я пытаюсь клонировать репозиторий Git, используя пользовательскую команду SSH. Я установил команду SSH в среде git_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

не могли бы вы помочь мне решить эту проблему?

5 ответов


вы не можете предоставить параметры в GIT_SSH переменные среды; с git man page:

   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 at /home/me/bin/bitbucket_ssh.

Я предпочитаю использовать .ssh/config когда это возможно, потому что это избегает необходимость создания сценария для каждого удаленного объекта.


обратите внимание, что начиная с git 2.3+ (Q1 2015), то, что вы изначально пытались, будет работать с новой переменной среды GIT_SSH_COMMAND.

посмотреть совершить 3994276 С Томас Quinot (quinot):

git_connect: установите команду оболочки ssh в GIT_SSH_COMMAND

может быть нецелесообразно устанавливать скрипт-оболочку для GIT_SSH когда дополнительные параметры должны быть переданы.
Укажите альтернативный способ указания команда оболочки для запуска, включая аргументы командной строки, с помощью GIT_SSH_COMMAND переменной окружения, которая ведет себя как GIT_SSH но передается в оболочке.

специальная схема для изменения параметров в случае использования Putty's plink / tortoiseplink активируется только при использовании GIT_SSH; в случае использования GIT_SSH_COMMAND, это намеренно оставлено до пользователя, чтобы сделать любую необходимую адаптацию параметров перед вызовом базового ssh реализация.

GIT_SSH_COMMAND:

если установлена любая из этих переменных среды, то'git fetch' и 'git push будет использовать указанную команду вместо 'ssh ' когда им нужно подключиться к удаленной системе.
Команде будет дано ровно два или четыре аргумента:

  • в 'username@host' (или просто 'host') из URL-адреса и команды оболочки для выполнения в этой удаленной системе, необязательно предшествующей by'-p' (в буквальном смысле) и
  • в 'port ' из URL-адреса, когда он указывает что-то другое, чем по умолчанию SSH порт.

$GIT_SSH_COMMAND берет верх над $GIT_SSH, и интерпретируется оболочкой, которая позволяет включать дополнительные аргументы.
$GIT_SSH С другой стороны, должен быть только путь к программе (который может быть сценарием оболочки оболочки, если необходимы дополнительные аргументы).


вы можете предоставить любой ключевой файл, который вы хотите использовать с командой 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

Подробнее см. ссылку.


использовать ssh-agent

ssh-agent bash -c 'ssh-add /home/me/my_private_key; git clone git@bitbucket.org:uname/test-git-repo.git'

дом на larsk ' s ответ и VonC ' s ответ, вы можете создать git_ssh.sh скриптов, таких как:

#!/bin/sh
# Workaround: GIT_SSH_COMMAND isn't supported by Git < 2.3
exec ${GIT_SSH_COMMAND:-ssh} "$@"
вызов такой:
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_ssh.sh самим Git к $GIT_SSH_COMMAND.

на ${...:-ssh} часть, в то время как не строго необходимо хорошее прикосновение, которое сделает $GIT_SSH_COMMAND по умолчанию , а поэтому GIT_SSH=git_ssh.sh не сломает нормальный git исполнения.

как добавленное значение, этот скрипт полностью игнорируется Git v2.3+, и $GIT_SSH_COMMAND используется непосредственно в этом случае.