Câu hỏi Cygwin / Git Bizarre Terminal Issue


Được rồi, điều này thật kỳ lạ. Trước hết, đây là mintty chạy trên cygwin up-to-date, với git kéo 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 chứ 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

15
2018-06-30 16:31


gốc


Tôi đoán một vấn đề thiết bị đầu cuối. Thực tế là mật khẩu của bạn xuất hiện cho thấy rằng thiết bị đầu cuối không được đưa vào 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 trở lại sau khi bạn nhấn ^C cho thấy rằng các ký tự không đượ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 bạn đã tìm ra manh mối - tôi đã xem xét đ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ư python có thể thực thi được ... - emptyset
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 có tìm thấy giải pháp cho vấn đề này không? - pauldoo


Các câu trả lời:


OK, tôi nghĩ tôi đã tìm được một giải pháp nhất đị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ó lựa chọn thay thế được cấu hình tốt hơn, cố gắng sử dụng "lời nhắc mật khẩu đơn giản" (như bạn có thể đọc trong mô tả core.askpass  tùy chọn cấu hình).

Lời nhắc mật khẩu đơn giản dường như chỉ hoạt động trên UNIX thực, nhưng không hoạt động trên Cygwin.

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

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

  1. cài đặt, dựng lên win-ssh-askpass ứng dụng 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 của Borland Delphi 5 theo yêu cầu của win-ssh-askpass (khó có thể đến ngày nay, nhưng đã tìm thấy trên http://www.satsignal.eu/software/runtime.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 dấu trừ.
  4. Nhớ luôn luôn đặt thông tin đăng nhập của bạn vào 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 tiện ích askpass. 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 này sẽ được gửi tới 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 hỏi mật khẩu bằng cách sử dụng một cửa sổ GUI thanh lịch và hoạt động bất kể thiết bị đầu cuối được sử dụng :)


8
2018-06-10 14:15



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 điều đó tốt. - corretge
Tôi chỉ cần chạy sau đây và nó bật một gui: git config --global core.askpass "git-gui - askpass" clone - Derek Greer


Tôi đã có kinh nghiệm cùng một vấn đề - tuy nhiên trong trường hợp của tôi tôi SSH'd trong máy chủ Cygwin vì vậy rõ ràng là một Win32 GUI askpass sẽ không hoạt động.

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

/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

Đảm bảo tập lệnh này có thể thực thi và sử dụng nó làm cài đặt core.askpass của git. Vì kịch bản này dựa vào biến $ SSH_TTY, nó thường sẽ chỉ hoạt động từ SSH. Tuy nhiên, bạn có thể đặt $ SSH_TTY trong .bashrc hoặc là .bash_profile nếu không được đặt; theo cách này, nó sẽ hoạt động ngay cả từ bảng điều khiển. Dòng sau trong tập lệnh rc của bạn nên thực hiện:

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

7
2017-08-17 21:33



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 chuyển hướng (1> & 2) vào thông báo "Không mở được ..." để thông báo hiển thị. - Eric


các giải pháp trên không hiệu quả đối 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 tác nhân ssh

chỉ cần thêm vào ~ / .bashrc và khởi động lại bảng đ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

P.S. Chrome và Opera sử dụng linebreak 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


2
2018-05-19 12:07





Có thể bạn có metacharacter, chẳng hạn như &, trong URL. Điều này sẽ khiến cho git chạy ở chế độ nền và trên một 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 partway qua đường kẻ, và Ctrl-C sẽ làm cho phần còn lại của dòng (một lệnh riêng biệt) bị hủy bỏ.

Thật thú vị là git khởi tạo repo trong /cygdrive/c/src/project/dev/.git/ mặc dù bạn đã nói với nó để sử dụng ~/src/project/dev (trừ khi bạn có thư mục chính của bạn ở một nơi xa lạ). Điều này sẽ gợi ý rằng git lệ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ó sự cố & hoặc là ; trong URL.

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

Hãy thử một git clone từ một repo khác, hoặc sử dụng một phương tiện khác từ cùng một repo, để xem git thường bị nhầm lẫn hoặc chỉ cho repo này. Bạn cũng có thể thử đặt dấu nháy đơn xung quanh URL.


1
2017-07-06 04:42



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


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

Số phát hành 56 - mintty

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


1
2017-12-16 15:42





Câu hỏi đã được trả lời rồ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 rằng git đặt sau SSH_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 bạn!


1
2017-10-27 10:44





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

Dù sao, có thể là giá trị cố gắng tùy chọn khác.


0
2018-01-14 09:53





Tôi có cùng một vấn đề, và, trái với điều này sợi 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, mintty và Windows cổ điển cmd.exe.

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

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

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


0
2018-06-10 13:29





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

machine git.example.com
login yourlogin
password your password

Rõ ràng, bạn nên thiết lập quyền truy cập một cách thích hợp cho tệp.


0
2017-12-22 17:37



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