Ich hackte den Quellcode für plink, um es mit Unison kompatibel zu machen.
Wenn Sie nicht wissen, Unison ist ein Dateisynchronisierungstool, es führt einen "ssh" Befehl zum Herstellen einer Verbindung zu einem Remote-Server, aber es gibt keine ssh.exe für Windows; Es gibt Plink, das sehr nah ist, aber nicht nah genug (es verhält sich nicht so, wie Unison es erwartet), so dass die Leute normalerweise Wrapper darum herum machen, like this one.
Eines der Probleme ist, dass Unison die Passwortaufforderung erwartet, um stderr zu drucken (aber plink druckt es auf stdout und verursacht unisono verwirrt zu werden), also dachte ich, naja, sollte einfach genug sein, hack my thru plink's Code und lassen Sie die Eingabeaufforderung auf stdout drucken. also habe ich mich durchgecheckt und das getan.
Nächstes Problem: Ich kann auf die Aufforderung nicht antworten !! Egal was ich tippe, es hat keine Wirkung.
der Code für die Eingabe immer ist in etwa wie folgt aus:
hin = GetStdHandle(STD_INPUT_HANDLE);
....
r = ReadFile(hin, .....);
Ich bin nicht sicher, warum es auf diese Weise getan hat, aber ich bin kein Experte Kommandozeilen-Tools für Windows in der Gestaltung, so was tun Ich kenne! Aber ich denke, etwas fehlt beim Einrichten des Eingabehandles.
ich auf den Quellcode suchte die above wrapper tool und ich sehe dies: hconin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0)
und ich versuche es (nur für das Heck von ihm)
hin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
....
r = ReadFile(hin ......)
und überraschend es funktioniert! Ich kann jetzt auf die Aufforderung reagieren!
Warum ist das? Was ist "CONIN $"? und warum unterscheidet es sich von der STD_INPUT_HANDLE
?
ich von „erraten“ sortieren, dass FILE_SHARE_READ
und OPEN_EXISTING
eine Rolle in diesem spielen (da ssh aus einem anderen Prozess ausgeführt wird), aber ich möchte verstehen, was hier vor sich geht, und vergewissern Sie sich, dass dieser Code doesn Habe keine unerwünschten Nebeneffekte oder Sicherheitslücken oder so etwas Unheimliches!
Es ist wie opening/dev/console in Unix. :-) –
Es ist mehr wie '/ dev/tty', was auf den Prozess 'Controlling Terminal zeigt, während'/dev/console' ist normalerweise die physische Konsole (seriell oder tty1). – grawity
@Andrew: Wirklich? Wenn Sie stdin umleiten, wird '/ dev/stdin' in der umgeleiteten Datei angezeigt. Ich dachte, 'CONIN $' sollte trotz aller Umleitungen ins Terminal gelangen. –