Cygwin/Git 奇怪的终端问题

emp*_*set 16 cygwin zsh git mintty

好吧,这很奇怪。首先,这是在最新的 cygwin 上运行的 mintty,从 cygwin 的 setup.exe 中提取 git。我正在运行 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>
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?这是终端问题、shell 问题、git 问题还是 cygwin 问题?

更新:是的,我正在运行 Cygwin git 版本,而不是 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
Run Code Online (Sandbox Code Playgroud)

Ale*_*ski 9

好的,我想我已经找到了一个明确的解决方案。

问题在于,无论使用何种终端(puttycyg、mintty、cmd.exe),Git 默认情况下,在没有更好配置的替代方案的情况下,尝试使用“简单密码提示”(如您在core.askpass 配置选项)。

简单的密码提示显然只适用于真正的 UNIX,但不适用于 Cygwin。

解决方案是安装一个适用于 Windows 的 SSH_ASKPASS 兼容程序并配置 Git 以使用它。

我所做的是:

  1. 通过解压并复制到 C:\ 来安装win-ssh-askpass应用程序
  2. 下载并安装 win-ssh-askpass 所需的 Borland Delphi 5 运行时(现在很难获得,但在http://www.satsignal.eu/software/runtime.html上找到了一个)
  3. 配置 Git 以使用 win-ssh-askpass: 获取密码git config --global core.askpass "C:/win_ssh_askpass.exe"。请注意,EXE 文件的名称中有下划线,而不是减号。
  4. 请记住始终将您的登录名放在 URL ( https://<user>@<domain>/<repository>) 中。否则,Git 将使用相同的 askpass 实用程序在要求输入密码之前要求登录。您可能会在不知不觉中输入您的密码作为登录名,该密码将被发送到网络服务器并以纯文本形式登录在其访问日志中!

现在,Git 使用优雅的 GUI 窗口询问密码,无论使用何种终端都可以正常工作:)


小智 7

我遇到了同样的问题 - 但是在我的情况下,我在 Cygwin 服务器中使用 SSH,所以显然 Win32 GUI askpass 不起作用。

相反,我编写了这个简单的脚本来执行 askpass。我虽然也可以通过从常规提示中获取 tty 设备来使用它,/bin/tty.exe但由于未知原因而无法正常工作(请自行 tty 或寻找其他解决方案来获取 tty,也许我只是以某种方式弄错了)。

/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
Run Code Online (Sandbox Code Playgroud)

确保此脚本可执行并将其用作 git 的 core.askpass 设置。由于此脚本依赖于 $SSH_TTY 变量,因此它通常只能在 SSH 中工作。然而,你可以设置$ SSH_TTY中.bashrc.bash_profile如果取消设置; 这样它甚至可以从控制台工作。rc 脚本中的以下行应该这样做:

[ -z "$SSH_TTY" ] && export SSH_TTY=$(/bin/tty.exe)
Run Code Online (Sandbox Code Playgroud)