我使用 socal 在两个 UNIX 套接字之间创建代理服务器: /var/a.sock , /var/b.sock
client -> /var/a.sock -> MY_COMMAND -> /var/b.sock -> MY_COMMAND -> /var/a.sock ->client
。
以下命令仅适用于
client -> /var/a.sock -> /var/b.sock -> /var/a.sock -> client
。
socat UNIX-LISTEN:/var/a.sock,fork 'UNIX-CONNECT:/var/b.sock
我还需要一件事。发送前将 AAAA 替换为 BBBB
请问我该怎么做?
可能是这样的:
外部
socat
,在每个传入连接上/var/a.sock
分叉一个子进程,在其中像往常一样在两个地址之间建立双向通信:如果没有
nofork
,从套接字读取的内容将被写入套接字对,其另一端是 shell 的标准输入,而 shell 的标准输出将是相同的套接字对,并且 socat 会读取来自另一端的内容并将其发送到接受的套接字。有了
nofork
,我们就省去了中间人,作为一种优化,shell 的 stdin 和 stdout直接是接受的套接字。这里 shell 代码运行另一个
socat
命令,该-
命令将 (即STDIO
)socat
自己的 stdin 和 stdout 与连接套接字连接起来/var/b.sock
。socat
的 stdin 由 进行预处理sed
,而其输出由另一个 进行后处理sed
。注意
-u
¹不是标准选项;如果您的不支持它,您可以切换到perl
(perl -pe 'BEGIN{$| = 1}; s/AAAA/BBB/g'
)。如果通过这些套接字交换的数据不是基于行的,则可以使用
perl
而不是sed
并读取最多 8KiB 的块:只要 上的数据传送
a.sock
速度不超过perl
(并且 上的接收者b.sock
)能够处理的速度,并且发送的批次不超过 8KiB,那么消息就不太可能在 中间被切断AAAA
。¹ 以防止输出缓冲;尽管在 GNU 的情况下
sed
,它也会导致它一次读取一个字节的输入,虽然在这里没有必要,但并无害。