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" Каталог локального репозитория