Vấn đề thiết bị đầu cuối kỳ quái Cygwin / Git


16

Được rồi, điều này thật kỳ lạ. Trước hết, đây là mintty chạy trên cygwin cập nhật, với git được lấy từ setup.exe của cygwin. Tôi đang chạy 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>

Chuyện gì đang xảy ra ở đây? Đây có phải là một vấn đề thiết bị đầu cuối, một vấn đề vỏ, một vấn đề git, hoặc một vấn đề cygwin?

Cập nhật: Có, tôi đang chạy phiên bản Cygwin git, không phải phiên bản 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

1
Tôi đoán một vấn đề thiết bị đầu cuối. Việc mật khẩu của bạn xuất hiện cho thấy thiết bị đầu cuối không được đặt đúng chế độ im lặng (nơi nó không hiển thị các ký tự bạn nhập) và thực tế là văn bản mật khẩu xuất hiện lại sau khi bạn nhấn ^Ccho thấy các ký tự không xuất hiện ' t nhận được gửi đến stdin của quá trình git. Nhưng tôi không biết vấn đề cụ thể có thể là gì.
David Z

Cảm ơn về manh mối - Tôi đã tìm thấy điều này: code.google.com/p/mintty/issues/detail?id=56 - nhưng không có cách nào để đưa git vào chế độ tương tác như con trăn thực thi ...
trống

1
Bạn có chắc là bạn đang gọi phiên bản git của Cygwin không? Vấn đề Mintty 56 chỉ áp dụng cho các chương trình Windows gốc.
ak2

Bạn đã tìm thấy một giải pháp cho vấn đề này?
pauldoo

Câu trả lời:


9

OK, tôi nghĩ rằng tôi đã tìm thấy một giải pháp xác định.

Vấn đề là, bất kể thiết bị đầu cuối được sử dụng (puttycyg, mintty, cmd.exe), Git theo mặc định, trong trường hợp không có các lựa chọn thay thế được cấu hình tốt hơn, hãy thử sử dụng "dấu nhắc mật khẩu đơn giản" (như bạn có thể đọc trong phần mô tả về core.askpass tùy chọn cấu hình ).

Dấu nhắc mật khẩu đơn giản rõ ràng chỉ hoạt động trên UNIX thực, nhưng không phải trên Cygwin.

Giải pháp là cài đặt chương trình tương thích SSH_ASKPASS cho Windows và định cấu hình Git để sử dụng.

Những gì tôi đã làm là:

  1. Cài đặt ứng dụng win-ssh-Askpass bằng cách giải nén và sao chép vào C: \
  2. Tải xuống và cài đặt thời gian chạy Borland Delphi 5 theo yêu cầu của win-ssh-askpass (ngày nay khó có thể tìm thấy, nhưng tìm thấy một cái trên http://www.satsignal.eu/software/r nb.html )
  3. Định cấu hình Git để lấy mật khẩu bằng win-ssh-askpass : git config --global core.askpass "C:/win_ssh_askpass.exe". Lưu ý rằng tệp EXE có dấu gạch dưới trong tên của nó, không phải là dấu trừ.
  4. Hãy nhớ luôn đặt thông tin đăng nhập của bạn trong URL ( https://<user>@<domain>/<repository>). Nếu không, Git sẽ yêu cầu đăng nhập trước khi yêu cầu mật khẩu, sử dụng cùng một tiện ích hỏi. Bạn có thể vô tình nhập mật khẩu của mình làm thông tin đăng nhập, mật khẩu sẽ được gửi đến webserwer và đăng nhập vào nhật ký truy cập của nó dưới dạng văn bản thuần túy!

Bây giờ Git yêu cầu mật khẩu bằng cửa sổ GUI thanh lịch và hoạt động bất kể thiết bị đầu cuối được sử dụng :)


cảm ơn, chạy ngẫu nhiên, nhưng chạy :) Tôi không biết tại sao git không chạy như mong đợi. lật đổ làm tốt.
sửa lại

1
Tôi chỉ chạy phần sau và nó hiện ra một gui: git config --global core.askpass "git-gui - Askpass" clone
Derek Greer

7

Tôi đã gặp phải vấn đề tương tự - tuy nhiên trong trường hợp của tôi, tôi là SSH trong máy chủ Cygwin nên rõ ràng là một yêu cầu GUI Win32 sẽ không hoạt động.

Thay vào đó, tôi đã viết kịch bản đơn giản này để làm câu hỏi. Tôi mặc dù nó cũng có thể được sử dụng từ các lời nhắc thông thường bằng cách lấy thiết bị tty từ /bin/tty.exeđó nhưng nó không hoạt động vì một lý do không xác định (hãy tự mình kiểm tra hoặc tìm giải pháp khác để nhận được tty, có lẽ tôi đã hiểu sai ).

/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

Hãy chắc chắn rằng tập lệnh này có thể thực thi được và sử dụng nó làm cài đặt core.askpass của git của bạn. Vì tập lệnh này dựa trên biến $ SSH_TTY, thông thường nó sẽ chỉ hoạt động từ SSH. Tuy nhiên, bạn có thể đặt $ SSH_TTY trong .bashrchoặc .bash_profilenếu không đặt; cách này sẽ hoạt động ngay cả từ bàn điều khiển. Dòng sau trong tập lệnh RC của bạn sẽ làm điều đó:

[ -z "$SSH_TTY" ] && export SSH_TTY=$(/bin/tty.exe)

Tôi có thể xác nhận giải pháp này, hoạt động rất tốt.
schlamar

Điều này làm việc khá tốt cho tôi quá. Tuy nhiên, tôi đã phải thêm một chuyển hướng (1> & 2) vào thông báo "Không thể mở ..." để nó hiển thị.
Eric

2

các giải pháp trên không hiệu quả với tôi, nhưng tôi đã tìm thấy một giải pháp khác.

bạn phải chạy đại lý ssh

chỉ cần thêm vào ~ / .bashrc và khởi động lại bàn điều khiển

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 và Opera sử dụng tính năng ngắt dòng không tương thích với bash - chỉ cần sử dụng một trình duyệt khác để sao chép dán


1

Có thể bạn có một siêu vi khuẩn, chẳng hạn như &trong URL. Điều này sẽ khiến git chạy trong nền và trên hệ thống Unix, nó sẽ bị dừng ngay khi nó cố đọc từ stdin. A ;cũng sẽ chấm dứt lệnh giữa chừng và dòng Ctrl-Cnày sẽ khiến phần còn lại của dòng (một lệnh riêng) bị hủy bỏ.

Thật thú vị khi gitkhởi tạo repo /cygdrive/c/src/project/dev/.git/ngay cả khi bạn bảo nó sử dụng ~/src/project/dev(trừ khi bạn có thư mục nhà của mình ở một nơi xa lạ). Điều này sẽ gợi ý rằng gitlệnh không nhìn thấy phần còn lại của dòng lệnh, đó là điều sẽ xảy ra nếu có một chuỗi đi lạc &hoặc ;trong URL.

(Tôi đã gặp vấn đề này rất nhiều lần wget, mặc dù không phải với git.)

Hãy thử một git clonetừ một repo khác, hoặc sử dụng một phương tiện giao thông khác từ cùng một repo, để xem liệu gitnói chung có bị rối hay chỉ cho repo này. Bạn cũng có thể thử đặt dấu ngoặc đơn xung quanh URL.


~/srclà một liên kết tượng trưng đến /cygdrive/c/src( C:\src). Không có &trong URL. Tôi sẽ cố gắng sao chép một kho lưu trữ git công khai, nhưng nói chung những người đó sẽ không có mật khẩu ...
voidset

1

Hãy xem xét vấn đề sau - Tôi khá chắc chắn bây giờ nó chỉ là một hạn chế của sự tinh vi và khả năng tương tác với Windows.

Số 56 - bạc hà

Tôi cũng gặp vấn đề khi chạy mysql và như vậy từ mintty - vì vậy, câu trả lời là đó là vấn đề mô phỏng thiết bị đầu cuối.


1

Câu hỏi đã được trả lời ... Tôi chỉ muốn thêm cách tôi đã sửa:

Kiểm tra Windows Git Bash, tôi có thể thấy gitbộ đó theo sauSSH_ASKPASS

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

Vì vậy, trên Cygwin, tôi đã thêm cùng một biến vào .bashrc

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

hoặc là

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

Làm điều này, git mở SSH_ASKPASS từ Git ... Tôi không phải cài đặt bất kỳ SW bổ sung nào hoặc tạo bất kỳ tập lệnh bổ sung nào.

Hy vọng điều này có thể giúp đỡ!


0

Cách đây nhiều năm, tôi nhớ có một số vấn đề với xác thực CVS ​​của Cygwin ... đó là vấn đề bạn đã cài đặt Cygwin với các kết thúc dòng kiểu DOS hay Unix (CRLF so với chỉ LF); đó là một trong các tùy chọn trên hộp thoại cài đặt. Nếu bạn chọn sai (tôi nghĩ DOS là cái đã hoạt động), mật khẩu sẽ bị sai lệch hoặc có ký tự giả hoặc thứ gì đó.

Dù sao, có thể đáng để thử các tùy chọn khác.


0

Tôi có cùng một vấn đề, và, trái với này chủ đề , vấn đề xảy ra với Cygwin GIT trong tất cả các thiết bị đầu cuối có thể - puttycyg, minttyvà Windows cổ điển cmd.exe.

Tôi vẫn đang tìm kiếm một giải pháp thích hợp, nhưng có một cách giải quyết - mặc dù nó rất không an toàn, bạn có thể thử đặt mật khẩu vào URL kho lưu trữ, ví dụ:

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

Liệu cách giải quyết có hiệu quả với bạn không?


0

Nếu đó là kho lưu trữ bạn sử dụng thường xuyên, điều dễ nhất có thể là tạo tệp ~ / .netrc với

machine git.example.com
login yourlogin
password your password

Rõ ràng, bạn nên thiết lập các quyền hà khắc thích hợp trên tệp.


Tại sao không chỉ sử dụng ssh như một phương tiện giao thông?
vonbrand

0

Chỉ cần một sàng lọc về nhận xét # 2

Có một cygwin ssh-ask-pass (không chính thức) ở đây

Chỉ cần tải tar.bz2 và giải nén vào thư mục cygwin của bạn. Nó hoạt động mà không cần cài đặt thời gian chạy borland delphi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.