Я взламывал исходный код plink , чтобы сделать его совместимым с unison.
Если вы не знаете, unison - это инструмент синхронизации файлов, он запускает команду "ssh" для подключения к удаленному серверу, но ssh.exe для windows не существует; есть plink, который очень близок, но не достаточно близок (он не ведет себя так, как этого ожидает унисон), поэтому люди обычно делают вокруг него обертки, как этот .
одна из проблем заключается в том, что unison ожидает, что запрос пароля будет напечатан на stderr (но plink печатает его на stdout, и это вызывает путаницу unison), поэтому я подумал, что все должно быть достаточно просто, взломайте мой код через plink и заставьте его напечатать подсказку к stdout. так что я взломал свой путь и сделал это.
Следующая проблема: я не могу ответить на приглашение !! независимо от того, что я печатаю, это не имеет никакого эффекта.
код для получения ввода примерно такой:
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
и OPEN_EXISTING
играют в этом роль (поскольку ssh запускается из другого процесса), но я хочу понять, что здесь происходит, и убедиться, что в этом коде нет нежелательных побочных эффектов, дыр в безопасности или чего-то такого страшного!