目标:双向通信,同时以单向方式解码传入数据
理论:假设有一个代理/服务器侦听端口 8080,需要同时处理多个客户端。传入的数据是 Base64 编码的,应该对其进行解码并转发到另一个端口 ( 80 )。
实践:我想使用 socat 因为它的所有功能(也因为它是我知道的唯一一个可以做所有这些事情的人,如果你知道其他东西也可以):
- TCP 到 TCP
- UDP 转 TCP
- fork和reuseaddr
- 执行命令
我正在寻找类似的东西:
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
(GNUbase64
对我来说)缓冲它的输出,并且从它的外观来看,不能被告知不要这样做。openssl base64 -d
我的测试也是如此。不过,recode
可以告诉GNU不要使用 GNU 进行缓冲stdbuf
。
因此,对于socat
2,您应该能够执行以下操作:
socat tcp-listen:8080,fork,reuseaddr \
'exec1:stdbuf -o0 recode /b64 % nop | tcp:localhost:80'
使用socat
1,您可以执行以下操作:
socat tcp-listen:8080,fork,reuseaddr \
'system:"stdbuf -o0 recode /b64 | socat - tcp:localhost:80"'
这本质上与您的相同,但内联了中间脚本(以及非缓冲 Base64 解码)。