Frage

Ich hackte den Quellcode weg für Plink es kompatibel mit unisono zu machen.

Wenn Sie nicht wissen, Unison ist ein Datei-Synchronisation-Tool, es läuft ein „ssh“ Befehl an einen Remote-Server zu verbinden, aber es gibt keine ssh.exe für Fenster; es gibt Plink, die ganz in der Nähe, aber nicht nah genug (es verhält sich nicht wie unisono es erwartet), damit die Menschen in der Regel Wrapper machen um ihn herum, wie diese .

eines der Probleme ist, dass unisono die Aufforderung zur Kennworteingabe erwartet, stderr zu drucken (aber Plink druckt es stdout zu und verursacht unisono verwirrt sein), also dachte ich, na ja, sollte genug, einfach hacken meine thru Plink Code und macht es die Aufforderung zu stdout drucken. so gehackt ich mich durch und tat das.

Als nächstes Problem: Ich kann nicht auf die Aufforderung reagieren !! egal, was ich schreibe, es hat keine Wirkung.

Sie den 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-Tool für Windows in der Gestaltung, so etwas weiß ich! Aber ich meine, etwas bei der Einrichtung der Eingangsgriff fehlt.

Ich schaute auf den Quellcode für die über Wrapper-Tool und Ich sehe es: hconin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0)

, und ich versuche es (nur für das Heck davon)

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 ist es anders als die STD_INPUT_HANDLE?

ich sortieren können „erraten“, dass FILE_SHARE_READ und OPEN_EXISTING eine Rolle in diesem spielen (da ssh in einem anderen Prozess aus ausgeführt wird), aber ich möchte verstehen, was hier vor sich geht, und stellen Sie sicher, dass dieser Code doesn‘ t haben einige unerwünschte Nebenwirkungen oder Sicherheitslücken oder etwas beängstigend wie das!

War es hilfreich?

Lösung

CONIN$ ist die Konsole Eingabegerät. Normalerweise ist stdin eine offene Datei-Handle zu diesem, aber wenn stdin aus irgendeinem Grund umgeleitet wird, dann mit CONIN$ ermöglicht es Ihnen, Zugriff auf die Konsole trotz der Umleitung zu erhalten. Referenz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top