我删掉了plink的源代码,使其与unison兼容。
如果你不知道,unison是一个文件同步工具,它运行一个"ssh“命令来连接到远程服务器,但是没有用于windows的ssh.exe;有like this one,它非常接近,但不够接近(它的行为不像unison期望的那样),所以人们通常对它进行包装,plink。
其中一个问题是,unison期望将密码提示打印到stderr (但是plink将其打印到stdout,并导致unison被混淆),所以我认为,嗯,应该足够简单,通过thru 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_READ和OPEN_EXISTING在其中扮演了一个角色(因为ssh是从另一个进程中运行的),但我想了解这里发生了什么,并确保这段代码没有一些不想要的副作用或安全漏洞或类似的可怕东西!
发布于 2008-12-18 08:00:36
CONIN$是控制台输入设备。通常,标准输入是一个打开的文件句柄,但是如果标准输入由于某种原因被重定向,那么使用CONIN$将允许您在重定向的情况下访问控制台。Reference.
https://stackoverflow.com/questions/377152
复制相似问题