Действительно подробный способ проверить соединение Git через SSH?


109

При использовании GIT у меня возникают проблемы с использованием GIT поверх SSH , и, поскольку он отлично работает как на работе, так и дома с другим модемом, очевидно, мой домашний модем работает. У меня нет проблем с подключением через HTTP.

Итак, я предполагаю, что это проблема SSH, но я не эксперт в ее непосредственном использовании. Есть ли какая-либо команда, которую я могу запустить, которая устанавливает «тестовое» соединение и позволяет мне точно знать, когда и где по линии возникает проблема?

Практически все «большая» команда (например fetch, cloneили pushс большим количеством данных) из git(даже при запуске с -v) просто «висеть» в середине удаленного подключения без указания относительно того , почему они остановились, так что они бесполезны , ,

Могу ли я узнать больше о том, что происходит в соединении SSH?

Ответы:


113

Переменная среды

Начиная с Git версии 2.3.0, вы можете использовать переменную окружения GIT_SSH_COMMANDи передавать -vподробный аргумент, например:

GIT_SSH_COMMAND="ssh -v" git clone example

Чтобы быть более многословным, сделайте это -vvv:

GIT_SSH_COMMAND="ssh -vvv" git clone example

Git config

Начиная с версии Git 2.10.0, которая будет в репозиториях Ubuntu 17.04, вы можете сохранить эту конфигурацию глобально или для репо, как в этом примере:

git config core.sshCommand "ssh -vvv"
git pull

Для меня, по крайней мере, если я сделаю это: GIT_SSH_COMMAND="ssh -v" git clone exampleя могу отладить версию SSH, она печатается после Cloning intoсообщения, но не удается git clone. После удаления GIT_SSH_COMMANDэто работает. В конце концов, послужил цели.
Пауло Оливейра

5
На один раз это будет лучше:git -c core.sshCommand="ssh -vvv" pull
Джозеф Штраус

git config --global core.sshCommand "ssh -vvv" git clone example
Азиум

81

У меня была похожая проблема. Для отладки я добавил строку в свой ssh_config. Вот как я это сделал:

git remote -v

Там вы найдете следующую строку:

origin  git@github.com:me/test.git (fetch)
origin  git@github.com:me/test.git (push)

В этом случае хозяин есть github.com. Теперь вы можете добавить Host-Entry в ваш ssh config:

vim ~/.ssh/config

И добавить:

Host github.com
    LogLevel DEBUG3

Теперь, используя git-операции, вы должны получить множество отладочных сообщений. Чтобы получить меньше отладочных сообщений, попробуйте использоватьDEBUG1

Для версий GIT> = 2.3.0 см. Ответ @Flimm для более разумного решения.


14

Читая man git, есть некоторые полезные переменные среды, которые вы можете установить, GIT_TRACE_PACKETи GIT_TRACE. Например:

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

Немного опоздал к игре, но, надеюсь, это кому-нибудь поможет!


1
Это полезно, но вы не получаете никаких сообщений о проблемах соединения с SSH. Но если соединение SSH работает, это способ дальнейшей отладки.
Trendfischer

5

За 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.

Итак, попробуй ssh -v. Если это не говорит вам о том, что вам нужно знать, вы можете добавить один или два vсимвола для еще более подробной информации об отладке. Для Github, в частности, попробуйте ssh -vvvT git@github.com.

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


Спасибо за ответ, но я, вероятно, должен был задать вопрос по-другому (поскольку GitHub не разрешает прямые SSH-соединения, подобные этому). Я отредактировал пост и заголовок, но лучше ли отказаться от него и создать вместо него новый вопрос?
IQAndreas

@IQAndreas, GitHub разрешает подобные SSH-соединения в том смысле, что будет выполняться фаза аутентификации, и если проблема действительно возникает на шаге SSH, вы увидите это именно так. Если вы обнаружите, что вы даже не можете зайти так далеко, происходит что-то, что мешает установлению соединения.
13:00

1
Я проходил аутентификацию просто отлично, а иногда pushи pullна репо без проблем. Но часто это просто «зависает» в середине команды и не будет продолжаться (особенно, когда я передаю большие объемы данных, например большие cloneили push). Там нет сообщений об ошибках, он просто сидит и не продолжается.
IQAndreas

3

Я не вижу способа указать git (1) внешнюю команду для использования для ssh (1), но в качестве обходного пути просто переименуйте / path / to / ssh в /path/to/ssh.orig, создайте оболочку скрипт-обертка / path / to / ssh и добавьте в флаги -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

Я получаю подробный вывод при выполнении команд git, работающих через транспорт ssh. После завершения отладки удалите скрипт и восстановите /path/to/ssh.orig в / path / to / ssh.


4
Вместо того, чтобы перемещать файлы /usr/bin, рассмотрите возможность установки скрипта-оболочки /usr/local/bin.
Муру

2
По крайней мере, при моей странной установке Windows переменная окружения GIT_SSHможет указывать на двоичный файл, который вы хотите использовать в Git.
Coderer

Как уже говорилось, вы определенно не хотите изменять исходный файл ssh, но у меня есть сомнения по поводу обходного пути в / usr / local /. Это не прозрачно, и это легко растоптано. ЛУЧШЕ: поместите ваш обходной скрипт в $ HOME / bin и добавьте этот новый bin bin в переменную $ PATH вашего пользователя, перед другими сегментами PATH. И перед этим я бы проверил, нет ли еще лучшего решения ENV var (этот ответ старый).
Скотт Прайв
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.