Передача параметров ssh в git clone

103

Я пытаюсь запустить git cloneбез проверки ssh ключа хоста репозитория. Я могу сделать это по ssh вот так:

ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@host

Есть ли способ передать те же параметры ssh команде git clone?

Изменить: есть ограничение, что я не могу изменять ~/.ssh/configили любые другие файлы на этой машине.

Даниэль
источник
2
То, что вы пытаетесь сделать, очень рискованно, и вам, вероятно, не следует этого делать. Отключение проверки подлинности удаленного SSH-сервера - плохая идея в большинстве ситуаций. Вы фактически отключаете всю безопасность, полученную с помощью SSH, и становитесь уязвимыми для атак типа «человек посередине».
aef
1
Собственно, часто это именно то, что вы хотите сделать. У вас есть внутреннее репо. Если кому-то удалось это подделать, значит, у вас проблемы. Это совсем не «очень рискованно». Фактически, как часто вы выполняете внеполосную проверку ключа хоста? (Вы должны).
Грэм Николлс

Ответы:

47

Добавьте их в свой ~/.ssh/config:

Host host
    HostName host
    User user
    SshOption1 Value1
    SshOption2 Value2

HostЗапись , что вы будете указать в командной строке, и HostNameявляется истинным именем хоста. Они могут быть одинаковыми, или Hostзапись может быть псевдонимом. UserЗапись используется , если вы не укажете user@в командной строке.

Если вы должны настроить это в командной строке, установите GIT_SSHпеременную среды так, чтобы она указывала на сценарий с вашими параметрами в нем.

Джош Ли
источник
4
Я забыл сказать, что не могу изменять файлы на этой машине. В противном случае да, ваше решение сработает.
Daniel
28
Используйте GIT_SSHпеременную окружения.
Джош Ли,
153

Недавно выпущенный git 2.3 поддерживает новую переменную «GIT_SSH_COMMAND», которую можно использовать для определения команды с параметрами.

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@host

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

Борис
источник
Должна ли быть перед вами новая строка git cloneили код правильный?
Томаш Зато - Восстановите Монику
8
Это должно быть правильно, без новой строки переменная должна быть установлена ​​для следующей команды. Если вы добавите новую строку, вам нужно будет экспортировать переменную, тогда она также должна работать.
Борис
Спасибо, застрял на этом 2 дня!
Джеймс Гентес
Буйя! Спасибо.
Jasper Blues
Я считаю, что он не будет работать с версией git 1.9, есть ли альтернативное решение для git 1.9
lazarus
34

Другой вариант указания разных ключей - git config core.sshCommandgit 2.10 + (3 квартал 2016 г.).

Это является альтернативой переменной окружения , описанной в Борисе «s ответ )

См. Commit 3c8ede3 (26 июня 2016 г.), автор - Nguy Thn Thái Ngọc Duy ( pclouds) .
(Объединено Junio ​​C Hamano - gitster- в коммите dc21164 , 19 июля 2016 г.)

Была core.sshCommandдобавлена новая переменная конфигурации , чтобы указать, какое значение GIT_SSH_COMMAND использовать для каждого репозитория.

Подобно $GIT_ASKPASSили $GIT_PROXY_COMMAND, мы также сначала читаем из файла конфигурации, а затем возвращаемся к $GIT_SSH_COMMAND.

Это полезно для выбора разных закрытых ключей, нацеленных на один и тот же хост (например, github).

core.sshCommand:

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

Значит, git cloneможет быть:

cd /path/to/my/repo
git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' 
# later on
git clone host:repo.git

Если вы хотите применить это для всех репозиториев, как добавляет user1300959 в комментариях , вы должны использовать глобальную конфигурацию.

git config --global core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
VonC
источник
2
Скорее всего, у вас еще нет репо, поскольку у вас есть git clone- в этом случае вы можете захотеть настроить команду git ssh глобально:git config --global core.sshCommand ...
iurii
@ user1300959 Хорошее замечание, спасибо. Я включил ваш комментарий в ответ для большей наглядности.
VonC
Это лучший ответ.
MikeSchinkel
В последней части вам не хватает апострофа
Луиджи Лопес
@LuigiLopez Вы можете отредактировать ответ? Я рассмотрю вашу правку.
VonC
22

Вот сложный пример того, как передать аргументы ssh с помощью переменной GIT_SSH:

$ echo 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH="$PWD/ssh" git clone user@host

Примечание. Над строками указаны командные строки терминала, которые следует вставить в терминал. Он создаст файл ssh , сделает его исполняемым и выполнит.

Если вы хотите передать опцию закрытого ключа, проверьте Как указать git, какой закрытый ключ использовать? .

Kenorb
источник
Ницца! Вопрос: Кажется, оба $*и "$@"работают. Обычно я использую "$@", так как другой кажется устаревшим. Есть ли причина отдавать предпочтение $*в этом случае?
mh8020,
16

Конфигурация уровня репозитория без влияния на настройки системного уровня

Обобщая уже имеющиеся ответы, я выбираю следующие шаги. Это гарантирует, что изменения конфигурации не повлияют на уровень машины, а только на репозиторий, над которым работаете. Это необходимо в моем случае, поскольку мой сценарий должен выполняться на общем агенте Bamboo.

1. Склонируйте репозиторий, используя GIT_SSH_COMMANDподход.

GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone ssh://url

2. После клонирования перейдите в каталог репозитория.

cd repo-dir

3. Настройте core.sshCommandконфигурацию так, чтобы все будущие вызовы можно было просто запускать с помощью команд git, как обычно, но с внутренним использованием предоставленных параметров git.

git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
Паван Кумар
источник
1
Хорошее применение core.sshCommand, о чем я упоминал выше. Проголосовали.
VonC
5

Я думаю, что обновить git до версии> = 2.3 и использовать GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@host- это вариант ставки, но если это невозможно, @ josh-lee дал хороший вариант, но, пожалуйста, обновите свой ответ, сделав отступ в файле конфигурации ssh.

Host host
    HostName host
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
Джонатан Бебер
источник
0

Эта проблема была устранена путем выполнения следующих шагов на Windows-машине: -

  • Создайте файл конфигурации в папке C: \ Users \ username.ssh.

  • добавьте следующую строку в файл конфигурации.

    host <HOST>
    hostname <HOSTNAME>
    user <USER_NAME>
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    port <PORT_NUMBER>
    KexAlgorithms +diffie-hellman-group1-sha1
    
  • затем попробуйте еще раз.

Аджай Кумар
источник