Я взломал исходный код для plink, чтобы сделать его совместимы с унисоном.
Если вы не знаете, unison — это инструмент синхронизации файлов, он запускает команду «ssh» для подключения к удаленному серверу, но для Windows нет ssh.exe; есть plink, который очень близок, но не достаточно (он не ведет себя так, как ожидает унисон), поэтому люди обычно делают вокруг него обертки, как этот.
одна из проблем заключается в том, что unison ожидает, что запрос пароля будет напечатан в stderr (но plink печатает его в stdout и вызывает путаницу в unison), поэтому я подумал, что это должно быть достаточно просто, взломать мой сквозной код 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 ...... )
и на удивление это работает! Теперь я могу ответить на приглашение!
Почему это? что такое "КОНИН$"? и чем он отличается от STD_INPUT_HANDLE
?
Я могу как бы "догадаться", что в этом играют роль FILE_SHARE_READ
и OPEN_EXISTING
(поскольку ssh запускается из другого процесса), но я хочу понять, что здесь происходит, и убедиться, что в этом коде нет нежелательные побочные эффекты или дыры в безопасности или что-то в этом роде страшное!