socat은 이중 에코를 비활성화합니다

socat은 이중 에코를 비활성화합니다

일반적인 대화형 Python 세션을 실행하면 입력/출력은 다음과 같습니다.

>>> 1 + 1;
2

이제 실행하려고 하므로 socat"서버"를 시작합니다.

socat UNIX-LISTEN:$HOME/socket,fork EXEC:python,pty,stderr

다른 터미널에서 연결합니다.

socat - UNIX-CONNECT:$HOME/socket

입력이 다시 에코된다는 점을 제외하면 거의 잘 작동합니다.

>>> 1 + 1;
1 + 1;
2

어떻게 끌 수 있나요? echo=0내가 원하는 것을 수행하지 않습니다. 이렇게 하면 내가 입력할 때 입력 내용이 숨겨지므로 별로 도움이 되지 않습니다. 일반적인 대화형 세션처럼 작동하길 원합니다.

(파이썬과 로컬 도메인 소켓을 사용하는 것은 단지 하나의 예일 뿐입니다. 다른 프로그램(예: cat, lua 등) 및 기타 소켓 유형(예: TCP 소켓)에서도 마찬가지입니다.

답변1

클라이언트 측에서 이것을 작성하십시오. 알아채다"날것의".

socat unix-connect:socket -,raw,echo=0

아니면 이거서비스 터미널. "에코=0"을 참고하세요.

socat unix-listen:socket exec:"python",pty,echo=0

하지만 둘 다일 수는 없습니다. 또는 클라이언트 stdio에서 raw를 사용하고 서버 pty에서 echo=0을 사용하면 작동하지만 echo=0을 두 번 적용해서는 안 됩니다.


1+1 두 가지를 살펴보겠습니다. 그것들은 메아리이지만 다른 의미를 가지고 있습니다. 첫 번째 에코는 클라이언트의 라인 버퍼에서 나오고, 두 번째 에코는 socat에 의해 생성된 서버측 터미널에서 나옵니다.

>>> 1 + 1;
1 + 1;
2

클라이언트 stdio에서 echo=0만 사용하면 socat는 stdio 버퍼의 에코(화면 표시)를 비활성화하도록 제어 터미널(예: xterm 또는 유사)에 알리므로 첫 번째 1+1이 사라지고 두 번째 1+1이 표시됩니다. 키를 눌렀습니다. 서버 pty의 echo=0은 socat가 수신한 입력을 클라이언트로 다시 에코(핑)하는 것을 방지하므로 두 번째 1+1이 사라집니다.그리고날것의클라이언트에서는 stdio의 버퍼링이 비활성화되어 있으므로 각 키는 반환이 서버로 전송될 때까지 기다리지 않고 서버는 즉시 키를 에코합니다.. 클라이언트 stdio에서는 raw를 사용하고 클라이언트 stdio에서는 echo=0을 사용합니다. 키를 누르면 키가 먼저 서버로 전송되고 서버는 이를 다시 전송하여 클라이언트에 표시합니다. 클라이언트 stdio에서 raw를 사용하고 서버 pty에서 echo=0을 사용하면 키를 눌렀을 때 서버로 전송될 때 동시에 표시되지만 다시 전송되지는 않습니다.


명령줄 편집의 경우 때로는 클라이언트 측에서 한 줄을 버퍼링하고 해당 줄 편집이 완료될 때까지 전체 줄을 보내지 않는 것만으로도 충분합니다. 그러나 강력한 스마트 완성 기능이 필요한 경우 서버 측 참여가 필요합니다.

관련 정보