Domanda

Sono stato a smanettare il codice sorgente per plink per renderlo compatibile con all'unisono.

Se non si conosce, Unison è uno strumento di sincronizzazione di file, viene eseguito un comando "ssh" per connettersi a un server remoto, ma non c'è ssh.exe per le finestre; c'è Plink, che è molto vicino, ma non abbastanza vicino (che non si comporta come all'unisono aspetta di), così la gente di solito fanno wrapper attorno ad esso, come questo .

uno dei problemi è che all'unisono si aspetta che la richiesta di password per stampare a stderr (ma la stampa Plink a StdOut, e fa sì che all'unisono per essere confuso), così ho pensato, beh, dovrebbe essere abbastanza semplice, incidere il mio attraverso il codice di plink e farla stampare la richiesta di stdout. così ho inciso il mio modo attraverso e fatto.

problema successivo: Non posso rispondere alla richiesta !! non importa quello che ho tipo, non ha alcun effetto.

il codice per avere un input è più o meno in questo modo:

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

Non sono sicuro perché è fatto in questo modo, ma io non sono un esperto nella progettazione di strumenti a linea di comando per le finestre, in modo che ne so io! Ma immagino qualcosa manca nella creazione della maniglia di ingresso.

Ho guardato il codice sorgente per il sopra strumento involucro Lo vedo: hconin=CreateFile("CONIN$",GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,0,0)

ed ho provato (solo per il gusto di farlo)

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

e sorprendentemente funziona! Ora posso rispondere alla richiesta!

Perché è questo? ciò che è "CONIN $"? e perché è diverso dal STD_INPUT_HANDLE?

Posso sorta di "indovinare" che FILE_SHARE_READ e OPEN_EXISTING stanno giocando un ruolo in questo (dal SSH viene eseguito all'interno di un altro processo), ma voglio capire che cosa sta succedendo qui, e fare in modo che questo codice doesn' t hanno alcuni effetti collaterali indesiderati o buchi di sicurezza o qualcosa di spaventoso come quello!

È stato utile?

Soluzione

CONIN$ è il dispositivo di input della console. Normalmente, stdin è un handle di file aperti a questo, ma se stdin viene reindirizzato per qualche motivo, quindi utilizzando CONIN$ vi permetterà di ottenere l'accesso alla console, nonostante il reindirizzamento. di riferimento.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top