Naprawdę pełny sposób testowania połączenia Git przez SSH?

109

Podczas korzystania z GIT mam problemy z używaniem GIT przez SSH , a ponieważ działa dobrze zarówno w pracy, jak iw domu z innym modemem, to oczywiście mój modem domowy działa. Nie mam problemów z połączeniem przez HTTP.

Zakładam, że jest to problem z SSH, ale nie jestem ekspertem w bezpośrednim korzystaniu z niego. Czy jest jakieś polecenie, które mogę uruchomić, które konfiguruje połączenie „testowe” i informuje mnie dokładnie, kiedy i gdzie wzdłuż linii występuje problem?

Prawie wszystkie „większe” polecenia (takie jak fetch, clonelub pushz dużą ilością danych) z git(nawet gdy są uruchomione -v) po prostu „zawieszają się” w trakcie zdalnego łączenia się bez wskazania, dlaczego przestały, więc nie są przydatne .

Czy jest jakiś sposób, aby uzyskać więcej informacji na temat tego, co dzieje się w połączeniu SSH?

IQAndreas
źródło

Odpowiedzi:

113

Zmienna środowiskowa

Z Gita w wersji 2.3.0 można użyć zmiennej środowiskowej GIT_SSH_COMMANDi przekazać -vpełny argument w następujący sposób:

GIT_SSH_COMMAND="ssh -v" git clone example

Aby być bardziej szczegółowym, zrób to -vvv:

GIT_SSH_COMMAND="ssh -vvv" git clone example

Konfiguracja Git

Od wersji Git 2.10.0, która będzie w repozytoriach Ubuntu 17.04, możesz zapisać tę konfigurację globalnie lub dla repozytorium, jak w tym przykładzie:

git config core.sshCommand "ssh -vvv"
git pull
Flimm
źródło
Dla mnie przynajmniej, jeśli to zrobię: GIT_SSH_COMMAND="ssh -v" git clone examplemogę debugować wersję SSH, zostanie wydrukowana po Cloning intowiadomości, ale nie powiedzie się git clone. Po usunięciu GIT_SSH_COMMANDdziała. W końcu służył celowi.
Paulo Oliveira,
5
Tym razem będzie lepiej:git -c core.sshCommand="ssh -vvv" pull
Joseph K. Strauss
git config --global core.sshCommand "ssh -vvv" git clone example
Azodium
81

Miałem podobny problem. Do debugowania dodałem wiersz w moim ssh_config. Oto jak to zrobiłem:

git remote -v

Tam znajdziesz taką linię:

origin  [email protected]:me/test.git (fetch)
origin  [email protected]:me/test.git (push)

W tym przypadku hostem jest github.com. Teraz możesz dodać wpis hosta w swojej konfiguracji ssh:

vim ~/.ssh/config

I dodaj:

Host github.com
    LogLevel DEBUG3

Korzystając z operacji git, powinieneś teraz dostać dużo komunikatów debugowania. Aby uzyskać mniejsze komunikaty debugowania, spróbuj użyćDEBUG1

W przypadku wersji GIT> = 2.3.0 zobacz odpowiedź od @Flimm na inteligentniejsze rozwiązanie.

Trendfischer
źródło
14

Po przeczytaniu man gitistnieje kilka przydatnych zmiennych środowiskowych, które można ustawić, GIT_TRACE_PACKETi GIT_TRACE. Na przykład:

GIT_TRACE_PACKET=true git clone ssh://[...]

Trochę za późno na grę, ale mam nadzieję, że to komuś pomoże!

bcherny
źródło
1
Jest to pomocne, ale nie pojawia się żaden komunikat o problemach z połączeniem z SSH. Ale jeśli połączenie SSH działa, jest to sposób na dalsze debugowanie.
Trendfischer
5

Za man ssh:

 -v      Verbose mode.  Causes ssh to print debugging messages about its progress.  This
         is helpful in debugging connection, authentication, and configuration problems.
         Multiple -v options increase the verbosity.  The maximum is 3.

Więc spróbuj ssh -v. Jeśli to nie mówi ci, co musisz wiedzieć, możesz dodać jeden lub dwa, vaby uzyskać jeszcze bardziej szczegółowe informacje debugowania. W szczególności w przypadku Github spróbuj ssh -vvvT [email protected].

Z mojego doświadczenia wynika, że ​​zazwyczaj sesja SSH zawiesza się podczas instalacji, gdy klient nie może ukończyć wybranej metody uwierzytelniania. Sprawdź, czy Twój klucz prywatny znajduje się we właściwym miejscu z odpowiednimi uprawnieniami i czy pasuje do klucza publicznego, który podałeś Github.

tgies
źródło
Dzięki za odpowiedź, ale prawdopodobnie powinienem zadać pytanie inaczej (ponieważ GitHub nie zezwala na bezpośrednie połączenia SSH w ten sposób). Zredagowałem post i tytuł, ale czy lepiej odrzucić ten i utworzyć nowe pytanie?
IQAndreas,
@IQAndreas, GitHub zezwala na takie połączenia SSH w tym sensie, że faza uwierzytelnienia zostanie przeprowadzona, a jeśli problem rzeczywiście występuje na etapie SSH, zobaczysz to w ten sposób. Jeśli okaże się, że nie możesz nawet dojść tak daleko, dzieje się coś, co uniemożliwia nawiązanie połączenia.
tgies
1
Uwierzytelnianie jest w porządku, a czasami push/ pullw repozytorium bez problemów. Ale często po prostu „zawiesza się” w środku polecenia i nie kontynuuje (szczególnie, gdy przesyłam duże ilości danych, takie jak duże clonelub push). Nie ma komunikatów o błędach, po prostu tam siedzi i nie kontynuuje.
IQAndreas,
3

Nie widzę sposobu, aby powiedzieć git (1) komendę zewnętrzną, która ma być użyta dla ssh (1), ale w celu obejścia tego problemu po prostu zmień nazwę / path / to / ssh na /path/to/ssh.orig, utwórz powłokę opakowanie skryptu / ścieżka / do / ssh i dodaj flagi -v:

$ sudo mv /usr/bin/ssh /usr/bin/ssh.orig
$ sudo vim /usr/bin/ssh
$ cat /usr/bin/ssh
#!/bin/sh

if [ -x /usr/bin/ssh.orig ]; then
    exec /usr/bin/ssh.orig -v -v -v "${@}"
fi

$ sudo chmod a+x /usr/bin/ssh

Otrzymuję pełne dane wyjściowe podczas wykonywania poleceń git działających w transporcie ssh. Po zakończeniu debugowania usuń skrypt i przywróć /path/to/ssh.orig do / path / to / ssh.

ScoobiFreeBSD
źródło
4
Zamiast przenosić pliki /usr/bin, rozważ umieszczenie skryptu opakowania /usr/local/bin.
muru
2
Przynajmniej przy mojej dziwnej instalacji systemu Windows zmienną środowiskową GIT_SSHmożna ustawić tak, aby wskazywała plik binarny, którego Git ma używać.
Coderer
Jak już powiedziano, zdecydowanie nie chcesz modyfikować oryginalnego pliku ssh, ale miałbym zastrzeżenia do obejścia tego w / usr / local /. Nie jest przezroczysty i łatwo go nadepnąć. LEPSZE: umieść skrypt obejścia w $ HOME / bin i dodaj nowy katalog bin do zmiennej $ PATH użytkownika, przed innymi segmentami PATH. A zanim to zrobię, sprawdzę, czy nie ma jeszcze lepszego wariantu ENV var (ta odpowiedź jest stara).
Scott Prive,