목표: 들어오는 데이터를 단방향으로 디코딩하는 동안 양방향 통신
이론: 포트 8080에서 수신 대기하는 프록시/서버가 있고 여러 클라이언트를 동시에 처리해야 한다고 가정합니다. 들어오는 데이터는 Base64로 인코딩되며 디코딩되어 다른 포트(80)로 전달되어야 합니다.
연습: 저는 socat의 모든 기능 때문에 사용하고 싶습니다(또한 이 모든 기능을 수행할 수 있는 유일한 제품이기 때문에, 다른 것을 알고 있다면 작동할 것입니다).
- TCP에서 TCP로
- UDP에서 TCP로
- 포크와 재사용 주소
- 주문 실행
나는 비슷한 것을 찾고 있습니다 :
socat tcp-listen:8080,reuseaddr,fork exec:/path/to/myscript.sh
/path/to/myscript.sh 사용:
#!/bin/sh
exec base64 -d | socat - tcp:localhost:80
하지만 불행히도 이것은 완전히 양방향이 아니기 때문에 제 경우에는 작동하지 않습니다.
답변1
귀하의 주요 문제는 아마도 base64 -d
( base64
나의 경우 GNU) 출력을 버퍼링하는 것이며, 외관상으로는 그렇게 하지 말라고 말할 수 없습니다. openssl base64 -d
내 테스트도 마찬가지다. 그러나 recode
GNU에게 버퍼링을 위해 GNU를 사용하지 않도록 지시하는 것은 가능합니다 stdbuf
.
따라서 socat
2의 경우 다음을 수행할 수 있어야 합니다.
socat tcp-listen:8080,fork,reuseaddr \
'exec1:stdbuf -o0 recode /b64 % nop | tcp:localhost:80'
1을 사용하면 socat
다음을 수행할 수 있습니다.
socat tcp-listen:8080,fork,reuseaddr \
'system:"stdbuf -o0 recode /b64 | socat - tcp:localhost:80"'
이것은 본질적으로 귀하의 것과 동일하지만 중간 스크립트 인라인(및 버퍼링되지 않은 Base64 디코딩)이 있습니다.