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

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

6 ответов

Решение

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

Обратите внимание, что начиная с git 2.3+ (первый квартал 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 с другой стороны, должен быть только путь к программе (который может быть сценарием оболочки-оболочки, если требуются дополнительные аргументы).

Опираясь на larsks и ответ 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 используется непосредственно в этом случае.

Используйте ssh-agent

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

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

Я ответил на тот же вопрос здесь: /questions/43047954/kak-ukazat-kakoj-ssh-klyuch-ispolzovat-v-git-dlya-git-push-chtobyi-sdelat-gitorious-zerkalom/43047962#43047962

Смотрите ссылку для деталей.

Лично я использую для этой цели конфигурационный файл SSH. Вы можете указать в нем все, что требуется. В руководстве говорится, что «git fetch и git push будут использовать указанную команду вместо ssh», но с «git clone» и другими работает хорошо. Пример части файла ssh.conf:

      Host khnSrv_al
HostName 192.168.1.201
Port 22
User al
LogLevel ERROR
PasswordAuthentication no
StrictHostKeyChecking no
IdentityFile /ubData/docs/PktDstSSH/key
UserKnownHostsFile /dev/null

Пример запуска:

      al@rznCad:~$ GIT_SSH_COMMAND="ssh -F /ubData/docs/PktDstSSH/config" git clone khnSrv_al:~/DrktrRepo/GNU_Gdb_10.1
Клонирование в «GNU_Gdb_10.1»…
remote: Перечисление объектов: 275, готово.
remote: Подсчет объектов: 100% (275/275), готово.
remote: Сжатие объектов: 100% (160/160), готово.
remote: Всего 275 (изменений 114), повторно использовано 275 (изменений 114), повторно использовано пакетов 0
Получение объектов: 100% (275/275), 1.51 МиБ | 10.44 МиБ/с, готово.
Определение изменений: 100% (114/114), готово.

Строка "-F /ubData/docs/PktDstSSH/config" указывает путь к файлу конфигурации клиента ssh, строка "khnSrv_al:~/DrktrRepo/GNU_Gdb_10.1" путь к каталогу репозитория для клонирования, "khnSrv_al:" имя хоста, указанное в файле конфигурации. При таком подходе можно использовать управление доступом к репозиторию с помощью SSH-сертификатов и собственного ЦС.

      al@rznCad:~$ git -C ~/GNU_Gdb_10.1 remote -v
origin  khnSrv_al:~/DrktrRepo/GNU_Gdb_10.1 (fetch)
origin  khnSrv_al:~/DrktrRepo/GNU_Gdb_10.1 (push)

#fetch
al@rznCad:~$ GIT_SSH_COMMAND="ssh -F /ubData/docs/PktDstSSH/config" git -C ~/GNU_Gdb_10.1 fetch origin master
Из khnSrv_al:~/DrktrRepo/GNU_Gdb_10.1
 * branch            master     -> FETCH_HEAD

#push
al@rznCad:~$ GIT_SSH_COMMAND="ssh -F /ubData/docs/PktDstSSH/config" git -C ~/GNU_Gdb_10.1 push origin master
Everything up-to-date

"-C ~/GNU_Gdb_10.1" Каталог локального репозитория

Другие вопросы по тегам