我正在破解源代码plink使其与一致兼容。
如果你不知道,unison是一个文件同步工具,它运行一个“ssh”命令来连接到远程服务器,但是Windows没有ssh.exe;有 plink,它非常接近,但还不够接近(它的行为不像 unison 期望的那样),所以人们通常围绕它制作包装,像这个.
问题之一是一致期望密码提示打印到stderr(但是plink将其打印到stdout,并导致一致混淆),所以我想,好吧,应该足够简单,破解我的plink代码并使其将提示打印到标准输出。所以我就想办法做到了。
下一个问题:我无法响应提示!无论我输入什么,都没有任何效果。
获取输入的代码大致是这样的:
hin = GetStdHandle(STD_INPUT_HANDLE);
....
r = ReadFile(hin, .....);
我不知道为什么要这样做,但我不是设计 Windows 命令行工具的专家,所以我知道什么!但我认为设置输入句柄时缺少一些东西。
我查看了源代码上面的包装工具我看到这个: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
and OPEN_EXISTING
正在其中发挥作用(因为 ssh 是从另一个进程中运行的),但我想了解这里发生了什么,并确保此代码没有一些不需要的副作用或安全漏洞或类似的可怕的东西!