Tôi đã lấy cắp mã nguồn cho plink để làm cho nó tương thích với unison.
Nếu bạn không biết, bỏ chọn là công cụ đồng bộ hóa tệp, nó chạy lệnh "ssh" để kết nối với máy chủ từ xa, nhưng không có ssh.exe cho cửa sổ; có plink, rất gần nhưng không đủ gần (nó không hoạt động như unison mong đợi nó), vì vậy mọi người thường làm cho wrappers xung quanh nó, like this one.
một trong những vấn đề là unison hy vọng lời nhắc mật khẩu để in để stderr (nhưng plink in nó để stdout, và gây ra unison bị nhầm lẫn), vì vậy tôi nghĩ, tốt, nên đơn giản, hack của tôi thông qua plink mã và làm cho nó in dấu nhắc để stdout. vì vậy tôi đã đột nhập và làm điều đó.
Sự cố tiếp theo: Tôi không thể trả lời lời nhắc !! không có vấn đề gì tôi gõ, nó không có hiệu lực.
mã cho nhận đầu vào là gần như thế này:
hin = GetStdHandle(STD_INPUT_HANDLE);
....
r = ReadFile(hin, .....);
Tôi không chắc chắn lý do tại sao nó được thực hiện theo cách này, nhưng tôi không phải là một chuyên gia trong việc thiết kế các công cụ dòng lệnh cho các cửa sổ, vì vậy những gì làm Tôi biết! Nhưng tôi hình một cái gì đó là mất tích trong việc thiết lập xử lý đầu vào.
tôi nhìn vào mã nguồn cho above wrapper tool và tôi thấy điều này: hconin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0)
và tôi thử nó (chỉ dành riêng cho các heck của nó)
hin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
....
r = ReadFile(hin ......)
và đáng ngạc nhiên nó hoạt động! Bây giờ tôi có thể trả lời lời nhắc!
Tại sao điều này? "CONIN $" là gì? và tại sao nó khác với STD_INPUT_HANDLE
?
Tôi có thể sắp xếp "đoán" rằng FILE_SHARE_READ
và OPEN_EXISTING
đang đóng vai trò này (vì ssh đang được chạy từ trong quá trình khác), nhưng tôi muốn hiểu điều gì đang xảy ra ở đây và đảm bảo rằng mã này không không có một số tác dụng phụ không mong muốn hoặc lỗ hổng bảo mật hoặc một cái gì đó đáng sợ như thế!
Giống như mở/dev/bàn điều khiển trong Unix. :-) –
Nó giống như '/ dev/tty', trỏ đến thiết bị đầu cuối điều khiển của quá trình, trong khi'/dev/console' thường là bảng điều khiển vật lý (serial hoặc tty1). – grawity
@Andrew: Thật sao? Nếu bạn chuyển hướng stdin, '/ dev/stdin' sẽ nhận được tại tệp được chuyển hướng. Tôi nghĩ rằng 'CONIN $' được cho là có được tại nhà ga, bất kể chuyển hướng nào. –