Przekazywanie opcji ssh do git clone

103

Próbuję uruchomić git clonebez ssh sprawdzania klucza hosta repozytorium. Mogę to zrobić z ssh w ten sposób:

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

Czy istnieje sposób, aby przekazać te same opcje ssh do polecenia git clone?

Edycja: istnieje ograniczenie, którego nie mogę modyfikować ~/.ssh/configani żadnych innych plików na tym komputerze.

Daniel
źródło
2
To, co próbujesz zrobić, jest bardzo ryzykowne i prawdopodobnie nie powinieneś tego robić. Wyłączenie weryfikacji tożsamości zdalnego serwera SSH jest w większości sytuacji złym pomysłem. Skutecznie wyłączasz wszystkie zabezpieczenia uzyskane dzięki użyciu SSH i otwierasz się na ataki typu man-in-the-middle.
aef,
1
W rzeczywistości często jest to dokładnie to, co chcesz zrobić. Masz wewnętrzne repozytorium. Jeśli komuś udało się to sfałszować, masz kłopoty. To wcale nie jest „bardzo ryzykowne”. W rzeczywistości, jak często sprawdzasz klucz hosta poza pasmem? (Powinieneś).
Graham Nicholls,

Odpowiedzi:

47

Dodaj je do ~/.ssh/config:

Host host
    HostName host
    User user
    SshOption1 Value1
    SshOption2 Value2

HostWpis jest co można określić w wierszu poleceń, a HostNamejest prawdziwa nazwa hosta. Mogą być takie same lub Hostwpis może być aliasem. UserPozycja jest używana, jeśli nie podasz user@w wierszu poleceń.

Jeśli musisz to skonfigurować w wierszu poleceń, ustaw GIT_SSHzmienną środowiskową tak, aby wskazywała na skrypt z twoimi opcjami.

Josh Lee
źródło
4
Zapomniałem powiedzieć, że nie mogę modyfikować żadnych plików na tym komputerze. W przeciwnym razie tak, twoje rozwiązanie zadziałałoby.
Daniel
28
Użyj GIT_SSHzmiennej środowiskowej.
Josh Lee
153

Niedawno wydany git 2.3 obsługuje nową zmienną „GIT_SSH_COMMAND”, której można użyć do zdefiniowania parametrów polecenia Z.

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

$GIT_SSH_COMMANDma pierwszeństwo przed $GIT_SSHi jest interpretowane przez powłokę, co pozwala na dołączenie dodatkowych argumentów.

Boris
źródło
Czy powinien pojawić się nowy wiersz przed, git cloneczy kod jest poprawny?
Tomáš Zato - Przywróć Monikę
8
Powinno być poprawne, bez nowej linii zmienna powinna być ustawiona dla następującego polecenia. Jeśli dodasz nową linię, będziesz musiał wyeksportować zmienną, wtedy też powinna działać.
Boris,
Dziękuję, utknąłem w tym przez 2 dni!
James Gentes,
Booya! Dziękuję Ci.
Jasper Blues
to nie zadziała z wersją git 1.9 Myślę, że jest jakieś alternatywne rozwiązanie dla gita 1.9
lazarus
33

Inną opcją umożliwiającą określenie różnych kluczy jest git config core.sshCommandgit 2.10 + (III kwartał 2016 r.).

Jest to alternatywa do zmiennej środowiskowej opisaną w Boris „s odpowiedzi )

Zobacz commit 3c8ede3 (26 czerwca 2016) autorstwa Nguyễn Thái Ngọc Duy ( pclouds) .
(Scalone przez Junio ​​C Hamano - gitster- w zatwierdzeniu dc21164 , 19 lipca 2016 r.)

Dodano nową zmienną konfiguracyjną, core.sshCommandaby określić, jaką wartość GIT_SSH_COMMAND ma używać na repozytorium.

Podobnie jak $GIT_ASKPASSor $GIT_PROXY_COMMAND, najpierw czytamy z pliku konfiguracyjnego, a następnie wracamy do $GIT_SSH_COMMAND.

Jest to przydatne do wybierania różnych kluczy prywatnych skierowanych do tego samego hosta (np. Github)

core.sshCommand:

Jeśli ta zmienna jest ustawiona, git fetchi git pushużyją określonego polecenia zamiast sshwtedy, gdy będą musieli połączyć się z systemem zdalnym.
Polecenie ma taką samą postać jak GIT_SSH_COMMANDzmienna środowiskowa i jest zastępowane, gdy zmienna środowiskowa jest ustawiona.

Oznacza to, że git clonemoże to być:

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

Jeśli chcesz zastosować to do wszystkich repozytoriów , jak dodaje w komentarzach user1300959 , użyj konfiguracji globalnej.

git config --global core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
VonC
źródło
2
Bardziej prawdopodobne jest, że nie masz jeszcze repozytorium, ponieważ je masz git clone- w tym przypadku możesz chcieć skonfigurować polecenie git ssh globalnie:git config --global core.sshCommand ...
iurii
@ user1300959 Słuszna uwaga, dziękuję. W odpowiedzi zawarłem Twój komentarz, aby uzyskać lepszą widoczność.
VonC
To najlepsza odpowiedź.
MikeSchinkel
W ostatniej części brakuje ci apostrofu
Luigi Lopez
@LuigiLopez Czy możesz edytować odpowiedź? Sprawdzę twoją zmianę.
VonC
22

Oto podstępny przykład przekazywania argumentów ssh przy użyciu zmiennej 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

Uwaga: powyższe wiersze to wiersze poleceń terminala, które należy wkleić do terminala. Stworzy plik ssh , uczyni go wykonywalnym i uruchomi go.

Jeśli chcesz przekazać opcję klucza prywatnego, sprawdź: Jak powiedzieć gitowi, którego klucza prywatnego użyć? .

kenorb
źródło
Miły! Pytanie: Oba $*i "$@"wydają się działać. Zwykle używam "$@", ponieważ drugi wydaje się być przestarzały. Czy jest powód, aby preferować $*ten przypadek?
mh8020
16

Konfiguracja na poziomie repozytorium bez wpływu na ustawienia na poziomie systemu

Podsumowując już dostępne odpowiedzi wybieram poniższe kroki. Gwarantuje to, że zmiany konfiguracji nie będą miały wpływu na poziomie maszyny, ale tylko na repozytorium, nad którym pracujesz. Jest to potrzebne w moim przypadku, ponieważ mój skrypt musi być wykonywany na współużytkowanym agencie Bamboo.

1. sklonuj repozytorium zgodnie z GIT_SSH_COMMANDpodejściem.

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

2. Po sklonowaniu przejdź do katalogu repozytorium.

cd repo-dir

3. Ustaw core.sshCommandkonfigurację tak, aby wszystkie przyszłe wywołania mogły być po prostu uruchamiane za pomocą poleceń git, jak zwykle, ale wewnętrznie konsumując dostarczone opcje git.

git config core.sshCommand 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'
Pavan Kumar
źródło
1
Niezłe wykorzystanie tego core.sshCommand, o czym wspomniałem powyżej. Głosowano za.
VonC,
5

Myślę, że aktualizacja gita do wersji> = 2.3 i użycie GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git clone user@hostjest opcją zakładu, ale jeśli nie jest to możliwe, @ josh-lee dał dobrą opcję, ale proszę zaktualizuj swoją odpowiedź, wciskając plik konfiguracyjny ssh.

Host host
    HostName host
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null
Jonathan Beber
źródło
0

Ten problem został rozwiązany, wykonując następujące kroki na komputerze z systemem Windows: -

  • Utwórz plik konfiguracyjny w folderze C: \ Users \ username.ssh.

  • dodaj następujący wiersz do pliku konfiguracyjnego.

    host <HOST>
    hostname <HOSTNAME>
    user <USER_NAME>
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    port <PORT_NUMBER>
    KexAlgorithms +diffie-hellman-group1-sha1
    
  • następnie spróbuj ponownie.

Ajay Kumar
źródło