문제

소스 코드를 해킹하고있었습니다 Plink Unison과 호환됩니다.

모르는 경우 Unison은 파일 동기화 도구이며 원격 서버에 연결하기 위해 "SSH"명령을 실행하지만 Windows 용 Ssh.exe는 없습니다. Plink가 있습니다. 매우 가까이 있지만 충분히 가깝지는 않습니다 (단일이 기대하는 것처럼 행동하지 않습니다). 이 같은.

문제 중 하나는 Unison이 비밀번호 프롬프트가 stderr에 인쇄 할 것으로 예상한다는 것입니다 (그러나 Plink는 그것을 stdout에 인쇄하고 Unison을 혼란스럽게합니다). 프롬프트를 stdout에 인쇄하십시오. 그래서 나는 길을 해킹하고 그렇게했습니다.

다음 문제 : 프롬프트에 응답 할 수 없습니다 !! 내가 무엇을 입력하든 효과가 없습니다.

입력을 얻기위한 코드는 다음과 같습니다.

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가 다른 프로세스 내에서 실행되기 때문에이 역할을하고 있지만 여기서 무슨 일이 일어나고 있는지 이해 하고이 코드가 원치 않는 부작용이나 보안 구멍이나 그와 같은 무서운 것이 있는지 확인하고 싶습니다. !

도움이 되었습니까?

해결책

CONIN$ 콘솔 입력 장치입니다. 일반적으로 stdin은 이것에 대한 열린 파일 핸들이지만 어떤 이유로 Stdin이 리디렉션되면 CONIN$ 리디렉션에도 불구하고 콘솔에 액세스 할 수 있습니다. 참조.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top