Cygwin / Git Bizarre Terminal Issue

15

Tudo bem, isso é estranho. Em primeiro lugar, este é o mintty rodando em cygwin atualizado, com git extraído do setup.exe do cygwin. Eu estou correndo 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>

O que está acontecendo aqui? Este é um problema de terminal, um problema de shell, um problema de git ou um problema de cygwin?

Atualização: Sim, estou executando a versão do Cygwin git, não a versão do 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
    
por emptyset 30.06.2010 / 18:31

10 respostas

8

OK, acho que encontrei uma solução definitiva.

O problema é que, independentemente do terminal usado (puttycyg, mintty, cmd.exe), o Git por padrão, na ausência de alternativas melhor configuradas, tenta usar um "prompt de senha simples" (como você pode ler em a descrição da opção de configuração core.askpass ).

O prompt de senha simples aparentemente funciona apenas no UNIX real, mas não no Cygwin.

A solução é instalar um programa compatível com SSH_ASKPASS para Windows e configurar o Git para usá-lo.

O que eu fiz foi:

  1. Instale o aplicativo win-ssh-askpass descompactando e copiando para C: \
  2. Faça o download e instale o tempo de execução do Borland Delphi 5 exigido pelo win-ssh-askpass (difícil encontrar atualmente, mas encontrou um em link )
  3. Configure o Git para obter senhas usando win-ssh-askpass: git config --global core.askpass "C:/win_ssh_askpass.exe" . Observe que o arquivo EXE tem sublinhados em seu nome, não sinais de menos.
  4. Lembre-se de sempre colocar seu login no URL ( https://<user>@<domain>/<repository> ). Caso contrário, o Git solicitará o login antes de solicitar a senha, usando o mesmo utilitário askpass. Você pode inadvertidamente inserir sua senha como o login, que será enviado para o webserwer e registrado em seu log de acesso como texto simples!

Agora o Git pede a senha usando uma elegante janela GUI e funciona independentemente do terminal usado:)

    
por 10.06.2011 / 16:15
7

Eu experimentei o mesmo problema - no entanto, no meu caso, eu tenho SSH no servidor do Cygwin, portanto, obviamente, um askpass Win32 GUI não funciona.

Em vez disso, eu escrevi este script simples para fazer o askpass. Eu pensei que ele poderia ser usado a partir de prompts regulares, também, obtendo o dispositivo tty de /bin/tty.exe , mas isso não funcionou por uma razão desconhecida (sinta-se à vontade para se tentar ou procurar outra solução para obter o tty, talvez errado de alguma forma).

/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

Certifique-se de que este script é executável e use-o como a configuração core.askpass do seu git. Como esse script depende da variável $ SSH_TTY, normalmente funcionará somente a partir do SSH. No entanto, você pode definir $ SSH_TTY em .bashrc ou .bash_profile se não estiver definido; Desta forma, deve funcionar mesmo a partir de uma consola. A seguinte linha no seu script rc deve fazê-lo:

[ -z "$SSH_TTY" ] && export SSH_TTY=$(/bin/tty.exe)
    
por 17.08.2011 / 23:33
2

as soluções acima não funcionam para mim, mas eu encontrei outra.

você tem que executar o agente ssh

apenas adicione ao ~ / .bashrc e reinicie o console

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

P.S. O Chrome e o Opera usam o linebreak, que não é compatível com o bash - basta usar outro navegador para copiar pasta

    
por 19.05.2014 / 14:07
1

É possível que você tenha um metacaractere, como & , na URL. Isso faria com que o git fosse executado em segundo plano, e em um sistema Unix ele seria parado assim que tentasse ler o stdin. Um ; também terminaria o comando parcialmente através da linha, e o Ctrl-C faria com que o resto da linha (um comando separado) fosse abortado.

É interessante que git inicialize o repo em /cygdrive/c/src/project/dev/.git/ , mesmo que você tenha dito para usar ~/src/project/dev (a menos que você tenha seu diretório home em um lugar estranho). Isso sugeriria que o comando git não está vendo o restante da linha de comando, que é o que aconteceria se houvesse uma dispersão & ou ; na URL.

(Eu tive esse problema muitas vezes com wget , embora não com git .)

Teste um git clone de um repositório diferente ou use um transporte diferente do mesmo repositório para ver se git está confuso geralmente ou apenas para este repo. Você também pode tentar colocar aspas simples na URL.

    
por 06.07.2010 / 06:42
1

Dê uma olhada no seguinte problema - estou bastante certo de que agora é apenas uma limitação da manutenção e da interoperabilidade com o Windows.

Edição 56 - cêntimo

Eu também tive problemas rodando o mysql e outros do mintty - então, a resposta é que é um problema de emulação de terminal.

    
por 16.12.2010 / 16:42
1

A pergunta já foi respondida ... Gostaria apenas de acrescentar como corrigi:

Verificando o Git Bash do Windows, pude ver que git foi definido após SSH_ASKPASS

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

Então, no Cygwin, adicionei a mesma variável a .bashrc

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

ou

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

Fazendo isso, o git abre o SSH_ASKPASS do Git ... Eu não tive que instalar nenhum SW adicional ou criar qualquer script adicional.

Espero que isso possa ajudar!

    
por 27.10.2017 / 12:44
0

Anos atrás eu me lembro de ter alguns problemas com a autenticação CVS do Cygwin ... era fazer com que você instalasse o Cygwin com os finais de linha estilo DOS ou Unix (CRLF vs apenas LF); é uma das opções na caixa de diálogo do instalador. Se você escolheu o errado (acho que o DOS era o que funcionava), a senha terminaria mutilada ou com um caráter espúrio ou algo assim.

De qualquer forma, pode valer a pena tentar a outra opção.

    
por 14.01.2011 / 10:53
0

Eu tenho o mesmo problema e, ao contrário deste encadeamento , o problema ocorre com Cygwin GIT em todos os terminais possíveis - puttycyg , mintty e o clássico Windows cmd.exe .

Ainda estou procurando uma solução adequada, mas há uma solução alternativa - embora seja muito insegura, você pode tentar colocar a senha no URL do repositório, por exemplo:

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

A solução funciona para você?

    
por 10.06.2011 / 15:29
0

Se é um repositório que você usa frequentemente, o mais fácil é criar um arquivo ~ / .netrc com

machine git.example.com
login yourlogin
password your password

Obviamente, você deve definir permissões draconianas no arquivo.

    
por 22.12.2011 / 18:37
0

Apenas um refinamento em comentário # 2

Há um ssh-ask-pass (não oficial) do cygwin aqui

Basta fazer o download do tar.bz2 e descompactar na sua pasta do cygwin. Ele funciona sem instalar o tempo de execução do Borland Delphi.

    
por 20.06.2011 / 14:24