¿Forma realmente detallada de probar la conexión Git sobre SSH?

109

Cuando uso GIT, tengo problemas con el uso de GIT sobre SSH , y dado que funciona bien tanto desde el trabajo como en casa con un módem diferente, obviamente es el módem de mi casa el que está funcionando mal. No tengo problemas para conectarme a través de HTTP.

Por lo tanto, supongo que es un problema de SSH, pero no soy un experto en usarlo directamente. ¿Hay algún comando que pueda ejecutar que establezca una conexión de "prueba" y me permita saber exactamente cuándo y dónde se produce el problema?

Casi todos los comandos "más grandes" (como fetch, cloneo pushcon muchos datos) de git(incluso cuando se ejecutan con -v) simplemente se "cuelgan" en el medio de la conexión remota sin indicación de por qué se han detenido, por lo que no sirven de nada .

¿Hay alguna forma de obtener más detalles sobre lo que sucede en la conexión SSH?

IQAndreas
fuente

Respuestas:

113

Variable ambiental

Desde Git versión 2.3.0, puede usar la variable de entorno GIT_SSH_COMMANDy pasar el -vargumento detallado de esta manera:

GIT_SSH_COMMAND="ssh -v" git clone example

Para ser más detallado, hazlo -vvv:

GIT_SSH_COMMAND="ssh -vvv" git clone example

Git config

Desde Git versión 2.10.0, que estará en los repositorios de Ubuntu 17.04, puede guardar esta configuración globalmente, o por repositorio como en este ejemplo:

git config core.sshCommand "ssh -vvv"
git pull
Flimm
fuente
Al menos para mí, si hago esto: GIT_SSH_COMMAND="ssh -v" git clone examplepuedo depurar la versión SSH, se imprime después del Cloning intomensaje, pero falla en git clone. Después de quitarlo GIT_SSH_COMMANDfunciona. Al final, cumplió el propósito.
Paulo Oliveira
55
Por una vez, esto será mejor:git -c core.sshCommand="ssh -vvv" pull
Joseph K. Strauss
git config --global core.sshCommand "ssh -vvv" git clone example
Azodium
81

Tuve un problema similar. Para la depuración, agregué una línea en mi ssh_config. Así es como lo hice:

git remote -v

Allí encontrarás una línea como esta:

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

En este caso el host es github.com. Ahora puede agregar una entrada de host en su configuración ssh:

vim ~/.ssh/config

Y añadir:

Host github.com
    LogLevel DEBUG3

Al usar las operaciones de git, ahora debería recibir muchos mensajes de depuración. Para obtener mensajes de depuración menores, intente usarDEBUG1

Para versiones GIT> = 2.3.0, consulte la respuesta de @Flimm para una solución más inteligente.

Trendfischer
fuente
14

Leyendo man git, hay algunas variables ambientales útiles que puede establecer, GIT_TRACE_PACKETy GIT_TRACE. Por ejemplo:

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

Un poco tarde para el juego, pero espero que esto ayude a alguien.

bcherny
fuente
1
Esto es útil, pero no recibe ningún mensaje sobre problemas de conexión con SSH. Pero si la conexión SSH funciona, esta es la forma de depurar más adelante.
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.

Entonces, inténtalo ssh -v. Si eso no le dice lo que necesita saber, puede agregar uno o dos vs para obtener información de depuración aún más detallada. Para Github en particular, intente ssh -vvvT [email protected].

Por lo general, en mi experiencia, una sesión SSH que se cuelga durante la configuración ocurre cuando el cliente no puede completar el método de autenticación elegido. Verifique que su clave privada esté en el lugar correcto con los permisos correctos y que coincida con la clave pública que le ha dado a Github.

tgies
fuente
Gracias por la respuesta, pero probablemente debería haber hecho la pregunta de manera diferente (ya que GitHub no permite conexiones SSH directas como esa). Edité la publicación y el título, pero ¿es mejor descartar esta y crear una nueva pregunta?
IQAndreas
@ IQAndreas, GitHub permite conexiones SSH como esa en el sentido de que la fase de autenticación se llevará a cabo y si el problema realmente está sucediendo en el paso SSH, lo verá de esa manera. Si descubres que ni siquiera puedes llegar tan lejos, está sucediendo algo que impide que se establezca la conexión.
Tgies
1
Estoy siendo autenticado muy bien, y a veces push/ pullen el repositorio sin problemas. Pero a menudo simplemente se "cuelga" en el medio del comando y no continuará (especialmente cuando transfiero grandes cantidades de datos, como un gran cloneo push). No hay mensajes de error, simplemente se queda allí y no continúa.
IQAndreas
3

No veo una manera de decirle a git (1) el comando externo que se debe usar para ssh (1), pero como solución alternativa, simplemente cambie el nombre / path / to / ssh a /path/to/ssh.orig, cree un shell script wrapper / path / to / ssh, y agregue las banderas -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

Obtengo resultados detallados al ejecutar comandos git que operan sobre un transporte ssh. Una vez realizada la depuración, elimine el script y restaure /path/to/ssh.orig en / path / to / ssh.

ScoobiFreeBSD
fuente
44
En lugar de mover archivos /usr/bin, considere colocar el script de contenedor /usr/local/bin.
muru
2
Al menos en mi extraña instalación de Windows, la variable de entorno GIT_SSHse puede configurar para que apunte al binario que desea que use Git.
Coderer el
Como se dijo, definitivamente no desea modificar el archivo ssh original, pero tendría reservas sobre la solución en / usr / local /. No es transparente y se pisotea fácilmente. MEJOR: coloque el script de solución alternativa en $ HOME / bin y agregue ese nuevo directorio bin en la variable $ PATH de su usuario, por delante de otros segmentos PATH. Y antes de hacerlo, comprobaría si no hay una solución ENV var que sea aún mejor (esta respuesta es antigua).
Scott Prive