Cygwin / Git Bizarre Terminal Issue

16

Muy bien, esto es raro. En primer lugar, esto es mintty ejecutándose en cygwin actualizado, con git extraído de setup.exe de cygwin. Estoy ejecutando zsh.

$ git clone https://<user>@<domain>/<repository>/ ~/src/project/dev
Initialized empty Git repository in /cygdrive/c/src/project/dev/.git/
Password: <actual password in plain text appears>
# Nothing happens...
^C
$ <password text that I just typed>
zsh: command not found: <same password text>

¿Que esta pasando aqui? ¿Es este un problema terminal, un problema de shell, un problema git o un problema cygwin?

Actualización: Sí, estoy ejecutando la versión de Cygwin git, no la versión de Windows:

$ which git
/usr/bin/git
$ git --version
git version 1.7.1
$ /cygdrive/c/Program\ Files\ \(x86\)/Git/bin/git.exe --version
git version 1.7.0.2.msysgit.0
conjunto vacio
fuente
1
Estoy adivinando un problema terminal. El hecho de que aparezca su contraseña sugiere que el terminal no se está poniendo correctamente en modo silencioso (donde no muestra los caracteres que escribe), y el hecho de que el texto de la contraseña aparezca nuevamente después de presionar ^Csugiere que los caracteres no están ' t enviado a stdin del proceso git. Pero no sé cuál podría ser el problema específico.
David Z
Gracias por la pista - Me encontré con esto: code.google.com/p/mintty/issues/detail?id=56 - pero no hay forma de poner git en modo interactivo como el ejecutable de Python ...
emptyset
1
¿Estás seguro de que estás invocando la versión de git de Cygwin? Mintty número 56 solo se aplica a los programas nativos de Windows.
ak2
¿Encontraste una solución a este problema?
pauldoo

Respuestas:

9

OK, creo que he encontrado una solución definitiva.

El problema es que, independientemente del terminal utilizado (puttycyg, mintty, cmd.exe), Git por defecto, en ausencia de alternativas mejor configuradas, intenta usar un "indicador de contraseña simple" (como puede leer en la descripción de core.askpass opción de configuración ).

La solicitud de contraseña simple aparentemente solo funciona en UNIX real, pero no en Cygwin.

La solución es instalar un programa compatible con SSH_ASKPASS para Windows y configurar Git para usarlo.

Lo que hice fue:

  1. Instale la aplicación win-ssh-askpass desempacando y copiando en C: \
  2. Descargue e instale el tiempo de ejecución Borland Delphi 5 requerido por win-ssh-askpass (difícil de encontrar hoy en día, pero encontró uno en http://www.satsignal.eu/software/runtime.html )
  3. Configurar Git para obtener contraseñas usando ganar-ssh-askpass: git config --global core.askpass "C:/win_ssh_askpass.exe". Tenga en cuenta que el archivo EXE tiene guiones bajos en su nombre, no signos menos.
  4. Recuerde colocar siempre su inicio de sesión en la URL ( https://<user>@<domain>/<repository>). De lo contrario, Git solicitará el inicio de sesión antes de solicitar la contraseña, utilizando la misma utilidad askpass. Sin saberlo, puede ingresar su contraseña como inicio de sesión, que se enviará al servidor web y se registrará en su registro de acceso como texto sin formato.

Ahora Git solicita la contraseña utilizando una elegante ventana GUI y funciona independientemente del terminal utilizado :)

Aleksander Adamowski
fuente
gracias, corre al azar, pero corre :) No sé por qué git no corre como se esperaba. Subversion hazlo bien.
corretge
1
Acabo de ejecutar lo siguiente y aparece una interfaz gráfica de usuario: git config --global core.askpass "git-gui - askpass" clon
Derek Greer
7

Experimenté el mismo problema; sin embargo, en mi caso, estoy SSH'd en el servidor Cygwin, por lo que obviamente un Winpass GUI askpass no funcionará.

En cambio, escribí este script simple para hacer el askpass. Pensé que también podría usarse a partir de indicaciones regulares obteniendo el dispositivo tty, /bin/tty.exepero eso no funcionó por una razón desconocida (siéntase libre de tty o busque otra solución para obtener el tty, tal vez me equivoqué de alguna manera )

/bin/askpass.sh:

#!/bin/bash

TTY=$SSH_TTY
[ -c "$TTY" -a -r "$TTY" -a -w "$TTY" ] \
  || { echo "Failed to open device \`$TTY'!"; exit 1; }
exec <$TTY

echo -n "$@" >$TTY
read -s P
echo >$TTY

echo $P

Asegúrese de que este script sea ejecutable y úselo como la configuración core.askpass de su git. Dado que este script se basa en la variable $ SSH_TTY, normalmente solo funcionará desde SSH. Sin embargo, puede establecer $ SSH_TTY en .bashrco .bash_profilesi no está configurado; de esta manera debería funcionar incluso desde una consola. La siguiente línea en su script rc debería hacerlo:

[ -z "$SSH_TTY" ] && export SSH_TTY=$(/bin/tty.exe)
Thomas Guyot-Sionnest
fuente
Puedo confirmar esta solución, funciona muy bien.
schlamar
Esto funcionó bastante bien para mí también. Sin embargo, tuve que agregar una redirección (1> y 2) en ese mensaje "Error al abrir ..." para que sea visible.
Eric
2

Las soluciones anteriores no me funcionan, pero encontré otra.

tienes que ejecutar el agente ssh

simplemente agregue a ~ / .bashrc y reinicie la consola

SSH_ENV=$HOME/.ssh/environment



# start the ssh-agent

function start_agent {

    echo "Initializing new SSH agent..."

    # spawn ssh-agent

    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"

    echo succeeded

    chmod 600 "${SSH_ENV}"

    . "${SSH_ENV}" > /dev/null

    /usr/bin/ssh-add

}



if [ -f "${SSH_ENV}" ]; then

     . "${SSH_ENV}" > /dev/null

     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {

        start_agent;

    }

else

    start_agent;

fi

PS Chrome y Opera usan linebreak que no es compatible con bash, solo usa otro navegador para copiar y pegar

Aloy
fuente
1

Es posible que tenga un metacarácter, como &en la URL. Esto haría que git se ejecute en segundo plano, y en un sistema Unix se detendría tan pronto como intentara leer desde stdin. A ;también terminaría el comando a medio camino a través de la línea, y Ctrl-Cprovocaría que el resto de la línea (un comando separado) se abortara.

Es interesante que gitinicialice el repositorio /cygdrive/c/src/project/dev/.git/aunque le haya dicho que lo use ~/src/project/dev(a menos que tenga su directorio de inicio en un lugar extraño). Esto sugeriría que el gitcomando no está viendo el resto de la línea de comando, que es lo que sucedería si hubiera un extravío &o ;en la URL.

(He tenido este problema muchas veces con wget, aunque no con git).

Intente git clonecon un repositorio diferente, o use un transporte diferente del mismo repositorio, para ver si gitestá mal en general o solo para este repositorio. También puede intentar poner comillas simples alrededor de la URL.

Neil Mayhew
fuente
~/srces un enlace simbólico a /cygdrive/c/src( C:\src). No hay &en la URL. Intentaré clonar un repositorio público de git, pero en general no tendrán una contraseña ...
emptyset
1

Eche un vistazo al siguiente problema: estoy bastante seguro de que ahora es solo una limitación de importancia e interoperabilidad con Windows.

Edición 56 - mintty

También he tenido problemas al ejecutar mysql y similares desde mintty, por lo tanto, la respuesta es que es un problema de emulación de terminal.

conjunto vacio
fuente
1

La pregunta ya fue respondida ... Solo me gustaría agregar cómo lo arreglé:

Comprobando Windows Git Bash, pude ver ese gitconjunto siguienteSSH_ASKPASS

$ echo $SSH_ASKPASS
/mingw64/libexec/git-core/git-gui--askpass

Entonces, en Cygwin, agregué la misma variable a .bashrc

# Unconditionally export SSH_ASKPASS
export SSH_ASKPASS="/mingw64/libexec/git-core/git-gui--askpass"

o

# export SSH_ASKPASS only if git is installed
hash git 2>/dev/null && export SSH_ASKPASS="/mingw64/libexec/git-core/git-gui--askpass"

Al hacer esto, git abre SSH_ASKPASS desde Git ... No tuve que instalar ningún SW adicional ni crear ningún script adicional.

Espero que esto pueda ayudar!

W0rmH0le
fuente
0

Hace años, recuerdo haber tenido algunos problemas con la autenticación CVS de Cygwin ... tenía que ver con si instaló Cygwin con las terminaciones de línea de estilo DOS o Unix (CRLF versus solo LF); Es una de las opciones en el cuadro de diálogo del instalador. Si eligió la incorrecta (creo que DOS fue la que funcionó), la contraseña terminaría destrozada o con un carácter espurio o algo así.

De todos modos, podría valer la pena probar la otra opción.

Timday
fuente
0

Tengo el mismo problema y, al contrario de este hilo , el problema ocurre con Cygwin GIT en todos los terminales posibles puttycyg, minttyy el clásico Windowscmd.exe .

Todavía estoy buscando una solución adecuada, pero hay una solución alternativa, aunque es muy insegura, puede intentar colocar la contraseña en la URL del repositorio, por ejemplo:

git clone https://<user>:<password>@<domain>/<repository>/

¿La solución alternativa funciona para usted?

Aleksander Adamowski
fuente
0

Si es un repositorio que usa con frecuencia, lo más fácil puede ser crear un archivo ~ / .netrc con

machine git.example.com
login yourlogin
password your password

Obviamente, debe establecer permisos draconianos apropiados en el archivo.

Carson Chittom
fuente
¿Por qué no solo usar ssh como transporte?
vonbrand
0

Solo un refinamiento en el comentario # 2

Hay un cygwin ssh-ask-pass (no oficial) aquí

Simplemente descargue el archivo tar.bz2 y descomprímalo en su carpeta cygwin. Funciona sin instalar borland delphi runtime.

Raghu
fuente