Передача 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
Я забув сказати, що не можу змінювати жодних файлів на цій машині. Інакше так, ваше рішення спрацювало б.
Даніель

28
Використовуйте GIT_SSHзмінну середовища.
Джош Лі

152

Нещодавно випущений 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або код правильний?
Томаш Зато - Відновити Моніку

7
Це має бути правильним, без нового рядка змінна повинна бути встановлена ​​для наступної команди. Якщо ви додасте новий рядок, вам потрібно було б експортувати змінну, вона також повинна працювати.
Борис

Дякую, я затримався на цьому 2 дні!
Джеймс Гентес

Буя! Дякую.
Джаспер Блюз

це не буде працювати з версією 1.9 git Я вважаю, чи є альтернативне рішення для git 1.9
lazarus

33

Ще один варіант, який задають різні ключі, - це git config core.sshCommand git 2.10 + (Q3 2016).

Це є альтернативою змінної оточення , описаної в Борисі «s відповідь )

Див. Команду 3c8ede3 (26 червня 2016 р.) Від Nguyễn Thái Ngọc Duy ( pclouds) .
(Об’єднав Хуніо С Хамано - 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

Якщо ви хочете застосувати це для всіх репостів , як додає користувач1300959 у коментарях , ви б використали глобальну конфігурацію.

git config --global core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

2
Більш ймовірно , що ви не маєте репо ще, так як ви git clone- в цьому випадку ви можете глобально налаштувати команду мерзотник SSH:git config --global core.sshCommand ...
Iurii

@ user1300959 Добрий момент, дякую. Я включив ваш коментар у відповідь для більшої наочності.
VonC

Це найкраща відповідь.
MikeSchinkel

В останній частині вам не вистачає апострофа
Луїджі Лопес

@LuigiLopez Чи можете ви відредагувати відповідь? Я перегляну вашу редакцію.
VonC

21

Ось хитрий приклад, як передавати аргументи 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, який приватний ключ використовувати? .


Приємно! Питання: І те, $*і, "$@"здається, працює. Зазвичай я використовую "$@", оскільки інший видається застарілим. Чи є причина віддати перевагу $*в цьому випадку?
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 config.

Host host
    HostName host
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

0

Цю проблему виправили, виконавши наступні кроки у машині Window: -

  • Створіть конфігураційний файл у папці 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
    
  • потім спробуйте ще раз.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.