Maneira realmente detalhada de testar a conexão Git sobre SSH?

109

Ao usar o GIT, tenho problemas ao usar o GIT sobre SSH e, como funciona muito bem no trabalho e em casa com um modem diferente, é obviamente o meu modem doméstico que está funcionando. Não tenho problemas para conectar-me por HTTP.

Portanto, suponho que seja um problema SSH, mas não sou especialista em usá-lo diretamente. Existe algum comando que eu possa executar que configure uma conexão de "teste" e me informe exatamente quando e onde o problema ocorre?

Praticamente todos os comandos "maiores" (como fetch, cloneou pushcom muitos dados) de git(mesmo quando executados com -v) apenas "travam" no meio da conexão remota, sem indicação de por que eles pararam, de modo que não servem para nada. .

Existe alguma maneira de obter mais detalhes sobre o que está acontecendo na conexão SSH?

IQAndreas
fonte

Respostas:

113

Variável de ambiente

No Git versão 2.3.0, você pode usar a variável de ambiente GIT_SSH_COMMANDe passar o -vargumento detalhado como este:

GIT_SSH_COMMAND="ssh -v" git clone example

Para ser mais detalhado, faça o seguinte -vvv:

GIT_SSH_COMMAND="ssh -vvv" git clone example

Configuração do Git

Na versão 2.10.0 do Git, que será encontrada nos repositórios do Ubuntu 17.04, você pode salvar essa configuração globalmente ou por repositório, como neste exemplo:

git config core.sshCommand "ssh -vvv"
git pull
Flimm
fonte
Pelo menos para mim, se eu fizer isso: GIT_SSH_COMMAND="ssh -v" git clone exampleposso depurar a versão SSH, é impressa após a Cloning intomensagem, mas falha em git clone. Depois de removê- GIT_SSH_COMMANDlo, funciona. No final, serviu ao propósito.
Paulo Oliveira
5
Por uma vez, isso será melhor:git -c core.sshCommand="ssh -vvv" pull
Joseph K. Strauss
git config --global core.sshCommand "ssh -vvv" git clone example
Azodium
81

Eu tive um problema parecido. Para depuração, adicionei uma linha no meu ssh_config. Aqui está como eu fiz isso:

git remote -v

Lá você encontrará uma linha como esta:

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

Nesse caso, o host é github.com. Agora você pode adicionar uma entrada de host na sua configuração ssh:

vim ~/.ssh/config

E adicione:

Host github.com
    LogLevel DEBUG3

Ao usar operações git, você deve receber muitas mensagens de depuração agora. Para receber menos mensagens de depuração, tente usarDEBUG1

Para versões GIT> = 2.3.0, consulte a resposta do @Flimm para obter uma solução mais inteligente.

Trendfischer
fonte
14

Lendo man git, existem algumas variáveis ​​ambientais úteis que você pode definir GIT_TRACE_PACKETe GIT_TRACE. Por exemplo:

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

Um pouco tarde para o jogo, mas espero que isso ajude alguém!

Bcherny
fonte
1
Isso é útil, mas você não recebe nenhuma mensagem sobre problemas de conexão com o SSH. Mas se a conexão SSH funcionar, esse é o caminho para depurar mais adiante.
Trendfischer
5

Por 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.

Então tente ssh -v. Se isso não informar o que você precisa saber, você pode adicionar um ou dois vs para obter informações de depuração ainda mais detalhadas. Para o Github em particular, tente ssh -vvvT [email protected].

Geralmente, na minha experiência, uma sessão SSH interrompida durante a instalação acontece quando o cliente não pode concluir o método de autenticação escolhido. Verifique se sua chave privada está no lugar certo, com as permissões corretas e se corresponde à chave pública que você deu ao Github.

tgies
fonte
Obrigado pela resposta, mas eu provavelmente deveria ter feito a pergunta de maneira diferente (já que o GitHub não permite conexões SSH diretas como essa). Editei o post e o título, mas é melhor descartar este e criar uma nova pergunta?
IQAndreas 12/12
@IQAndreas, o GitHub permite conexões SSH como essa no sentido de que a fase de autenticação será realizada e se o problema realmente estiver acontecendo na etapa SSH, você verá dessa maneira. Se você achar que não pode chegar tão longe, algo está acontecendo que impede a conexão de ser feita.
tgies
1
Estou sendo autenticado muito bem, e às vezes push/ pullno repositório sem problemas. Mas, muitas vezes, apenas "trava" no meio do comando e não continua (especialmente quando transfiro grandes quantidades de dados, como um grande cloneou push). Não há mensagens de erro, apenas fica lá e não continua.
IQAndreas
3

Não vejo uma maneira de dizer ao git (1) o comando externo a ser usado para o ssh (1), mas como solução alternativa, simplesmente renomeie / path / to / ssh para /path/to/ssh.orig, crie um shell wrapper de script / caminho / para / ssh e adicione os sinalizadores -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

Recebo uma saída detalhada ao executar comandos git operando em um transporte ssh. Após a depuração, exclua o script e restaure /path/to/ssh.orig para / path / to / ssh.

ScoobiFreeBSD
fonte
4
Em vez de mover arquivos /usr/bin, considere colocar o script do wrapper /usr/local/bin.
Muru
2
Pelo menos na minha estranha instalação do Windows, a variável de ambiente GIT_SSHpode ser configurada para apontar para o binário que você deseja que o Git use.
Coderer
Como foi dito, você definitivamente não deseja modificar o arquivo ssh original, mas eu gostaria de ter uma solução alternativa em / usr / local /. Não é transparente e é facilmente pisado. MELHOR: coloque seu script de solução alternativa em $ HOME / bin e adicione esse novo diretório bin na variável $ PATH do usuário, à frente de outros segmentos PATH. E antes de fazer isso, eu verificaria se não há uma solução ENV var ainda melhor (essa resposta é antiga).
9788 Scott-Prive #