SOCAT이 STDIO의 모든 문자를 보내도록 만드는 방법은 무엇입니까?

SOCAT이 STDIO의 모든 문자를 보내도록 만드는 방법은 무엇입니까?

다음과 같은 시나리오가 있습니다.

호스트 파이프(파이프/fifo라는 이름)에 연결된 노출된 직렬 포트가 있는 가상 머신에 Windows가 있습니다.

주요 파이프라인이 위치해 있습니다 /tmp/win-serial-com3.

내 호스트 OS에서 사용하고 있습니다.socat이와 같이:

socat - /tmp/win-serial-com3,cr

손님, 운전 좀 해주세요퍼티, "각 CR에 암시적 LF"를 설정하고 로컬 에코를 활성화합니다. PuTTY는 게스트 Windows에서 COM3을 엽니다.

둘 다 실행하면 반환 키가 제대로 작동하고 중복도 발생하지 않습니다. PuTTY를 입력하면 socat실행 중인 호스트 운영 체제의 터미널 에 각 문자가 차례로 나타나는 것을 볼 수 있습니다 .

그러나 호스트 OS에 무언가를 입력하면 로컬 에코가 표시되지만( echo=0옵션을 통해 꺼지지 않았기 때문에) 해당 문자는 시스템의 PuTTY에서 Enter 키를 누른 후에만 게스트 작업에 나타납니다.

내가 원하는 것은 키를 누를 때마다 해당 키가 명명된 파이프로 전송되어 본질적으로 게스트 OS의 PuTTY와 동일한 동작을 갖는 것입니다.

나는 이것이 STDIO()의 버퍼링과 관련이 있다고 생각 -하지만 확실하지 않습니다.

답변1

좋아, 나는 해결책을 찾았고, 꽤 많은 시행착오 끝에 다음과 같은 결과를 얻었습니다.

호스트 측(Linux)에서 socat호출 방법은 다음과 같습니다.

stty -icanon && socat - /tmp/win-serial-com3,cr

게스트 측에서는 "각 CR의 암시적 LF"를 사용하여 PuTTY를 호출해야 하며 터미널 설정에서 "각 LF의 암시적 CR"을 설정 해제해야 합니다.

이는 아직 이상적이지 않습니다.

backspace호스트 측을 누르면 ^?이전 문자를 삭제하는 대신 하나를 인쇄합니다. 방문자 측에서는 이것이 잘 작동합니다. 게스트 측을 누르면 backspace게스트 측의 문자가 삭제되지만 호스트 측에서는 삭제되지 않습니다. 아직 일할 방법을 찾지 못했습니다 backspace.

관련 정보