Question

je bidouiller le code source plink pour le rendre compatible avec l'unisson.

Si vous ne savez pas, l'unisson est un outil de synchronisation de fichiers, il exécute une commande « ssh » pour se connecter à un serveur distant, mais il n'y a pas ssh.exe pour les fenêtres; il y a Plink, qui est très proche, mais pas assez proche (il ne se comporte pas comme l'unisson attend à), afin que les gens font généralement wrappers autour, comme celui-ci .

l'un des problèmes est que l'unisson attend l'invite de mot de passe pour imprimer à stderr (mais imprime plink à StdOut, et provoque l'unisson confondre), donc je pensais, eh bien, devrait être assez simple, pirater mon à travers le code de Plink et le faire imprimer l'invite à stdout. donc je piraté mon chemin à travers et fait cela.

Problème suivant: Je ne peux pas répondre à l'invite !! peu importe ce que je tape, il n'a pas d'effet.

le code pour obtenir l'entrée est à peu près comme ceci:

hin = GetStdHandle(STD_INPUT_HANDLE);
....
r = ReadFile(hin, .....);

Je ne sais pas pourquoi il a fait de cette façon, mais je ne suis pas un expert dans la conception d'outils de ligne de commande pour les fenêtres, alors qu'est-ce que je sais! Mais je figure quelque chose manque dans la mise en place de la poignée d'entrée.

Je regardais le code source pour le ci-dessus outil d'emballage Je vois ça: hconin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0)

et j'essayer (juste pour le plaisir de le faire)

hin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0);
....
r = ReadFile( hin ...... )

et étonnamment cela fonctionne! Je peux maintenant répondre à l'invite!

Pourquoi est-ce? ce qui est "CONIN $"? et pourquoi est-il différent du STD_INPUT_HANDLE?

Je peux trier de « deviner » que FILE_SHARE_READ et OPEN_EXISTING jouent un rôle dans ce (puisque ssh est exécuté à partir d'un autre processus), mais je veux comprendre ce qui se passe ici, et assurez-vous que ce code n » t ont des effets secondaires indésirables ou des failles de sécurité ou quelque chose d'effrayant comme ça!

Était-ce utile?

La solution

CONIN$ est le dispositif d'entrée de la console. Normalement, stdin est un descripteur de fichier ouvert à ce sujet, mais si stdin est redirigée pour une raison quelconque, puis en utilisant CONIN$ vous permettra d'obtenir un accès à la console malgré la redirection. Référence.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top