plinkのソース コードをunisonと互換性を持たせるためにハッキングしていました。
unison はファイル同期ツールであり、「ssh」コマンドを実行してリモート サーバーに接続しますが、Windows 用の ssh.exe はありません。plink は非常に近いですが、十分に近いわけではありません (unison が期待するように動作しません)。そのため、人々は通常、このようなラッパーを作成します。
問題の 1 つは、unison がパスワード プロンプトが stderr に出力されることを期待していることです (ただし、plink はそれを stdout に出力し、unison を混乱させる原因となります)。プロンプトを標準出力に出力します。だから私は自分の道をハックしてそれをしました。
次の問題: プロンプトに応答できません!! 何を入力しても効果はありません。
入力を取得するためのコードは、おおよそ次のようになります。
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は別のプロセス内から実行されているため)が、ここで何が起こっているのかを理解し、このコードに不要な側面がないことを確認したい.エフェクトとかセキュリティホールとかそういう怖いもの!