Клон 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 [email protected]:uname/test-git-repo.git, я получаю следующую странную ошибку

error: cannot run /usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key
fatal: unable to fork

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


person Paris    schedule 08.01.2013    source источник
comment
Что произойдет, если вы просто запустите /usr/bin/ssh -o StrictHostKeyChecking=no -i /home/me/my_private_key в приглашении?   -  person Yuval Adam    schedule 08.01.2013
comment
он показывает мне информацию об использовании, потому что я не указал имя пользователя и хост. Если я предложу, мне просто откажут (что и ожидалось)   -  person Paris    schedule 08.01.2013
comment
Git 2.3+ (1 квартал 2015 г.) позволит более полное определение команды ssh (с новой переменной среды GIT_SSH_COMMAND). См. мой ответ ниже   -  person VonC    schedule 23.12.2014


Ответы (5)


Вы не можете указать параметры в переменной окружения 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 сценарий оболочки, который делает то, что вы хотите. Например, в /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, когда это возможно, потому что это избавляет от необходимости создавать сценарий для каждого удаленного устройства.

person larsks    schedule 08.01.2013
comment
Мне пришлось использовать IdentityFile, а не IdentityFile в .ssh/config. - person Soichi Hayashi; 23.04.2013
comment
У меня были проблемы с .ssh/config, как написано, мне пришлось убрать двоеточие, сделав строку Host bitbucket.org - person George Griffin; 23.07.2013
comment
Это действительно была опечатка. Спасибо! - person larsks; 23.07.2013
comment
Вы спасли мой день! Огромное спасибо ‹3 - person gustavohenke; 11.04.2016

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

См. коммит 3994276 из Томас Кино (quinot):

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

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

Специальная схема для изменения параметров в случае использования plink/tortoiseplink PuTTY активируется только при использовании GIT_SSH; в случае использования GIT_SSH_COMMAND пользователь намеренно оставляет на усмотрение пользователя возможность адаптации любых необходимых параметров перед вызовом базовой реализации ssh.

GIT_SSH_COMMAND:

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

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

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

person VonC    schedule 22.12.2014

Опираясь на ответ larsk и VonC ответить, вы можете создать 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_ssh.sh самим Git, в $GIT_SSH_COMMAND.

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

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

person Chen Levy    schedule 01.01.2018
comment
Хороший обходной путь для тех сред со старым Git. +1 - person VonC; 01.01.2018

Использовать ssh-агент

ssh-agent bash -c 'ssh-add /home/me/my_private_key; git clone [email protected]:uname/test-git-repo.git'
person TlmaK0    schedule 12.05.2014
comment
ssh_askpass также вызывается для проверки ключа хоста. - person zneak; 24.01.2017

Вы можете указать любой ключевой файл, который хотите использовать с командой Git, например:

$ PKEY=~/.ssh/keyfile.pem git clone [email protected]:me/repo.git

или это:

$ git.sh -i ~/.ssh/keyfile.pem clone [email protected]:me/repo.git

Я ответил на тот же вопрос здесь: https://stackoverflow.com/a/15596980

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

person alvinabad    schedule 24.03.2013
comment
Этот ответ сбивает с толку и бесполезен, потому что сначала нужно перейти по этой ссылке и создать содержащиеся в ней сценарии. И те также кажутся искаженными, учитывая, что (как показали другие) есть способы сделать то, что хотел OP, с помощью простых стандартных переменных среды git или файлов конфигурации SSH. - person hmijail mourns resignees; 04.12.2017