2008-12-18 90 views
6

我正在砍掉plink的源代碼以使其兼容。

如果你不知道,unison是一個文件同步工具,它運行一個「ssh」命令來連接到遠程服務器,但是沒有ssh.exe的windows;有plink,它非常接近但不夠接近(它不像unison期望的那樣),所以人們通常在它周圍製作包裝,like this one

其中一個問題是,unison期望密碼提示打印到stderr(但plink將其打印到stdout,並導致unison被混淆),所以我認爲,應該很簡單,破解我的通過plink代碼並使其輸出stdout提示。所以我闖入了我的路,並做到了這一點。

下一個問題:我無法迴應提示!不管我輸入什麼,它都不起作用。

用於獲取輸入的代碼大致是這樣的:

hin = GetStdHandle(STD_INPUT_HANDLE); 
.... 
r = ReadFile(hin, .....); 

我不知道它爲什麼做這樣,但我不是在設計的命令行工具的Windows方面的專家,所以做什麼我知道!但我認爲在設置輸入句柄時缺少一些東西。

我看了看源代碼爲above wrapper tool,我看到這一點: hconin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0)

,我嘗試它(只是爲了赫克)

hin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0); 
.... 
r = ReadFile(hin ......) 

和令人驚訝地工作!我現在可以迴應提示!

這是爲什麼?什麼是「CONIN $」?爲什麼它不同於STD_INPUT_HANDLE

我可以排序的「猜測」那FILE_SHARE_READOPEN_EXISTING在此發揮作用(因爲SSH正在從另一個進程中運行),但我想知道這是怎麼回事,並確保該代碼沒有按沒有一些不需要的副作用或安全漏洞或者可怕的東西!

回答

10

CONIN$是控制檯輸入設備。通常情況下,stdin是一個打開的文件句柄,但如果由於某種原因stdin被重定向,那麼使用CONIN$將允許您訪問控制檯而不管重定向。 Reference.

+0

這就像在Unix中打開/ dev/console。 :-) – 2008-12-18 08:12:22