问题描述
我正在尝试设置一个 shell 脚本来监听一个端口,转发到 n 个不同的 IP 地址,并返回其中一个 API 调用的结果。
socat TCP4-LISTEN:8080,fork,reuseaddr,crlf tcp4:127.0.0.1:8000
REST API 位于端口 8000,而我正在侦听端口 8080。
对于多个 IP 的情况,似乎我需要在某些情况下使用 tee
来拆分为多个 API 调用,例如:
socat TCP4-LISTEN:8080,crlf - | tee \
>(socat - tcp4:127.0.0.1:8000 | cat; echo "This ends") \
>(socat - tcp4:127.0.0.1:8000 | cat; echo "This ends too")
>/dev/null
虽然我能够从内部打印出 API 调用并且内部的 socat
调用终止(因为 This ends
和 This ends too
在端口 8080 上进行调用时都会被打印) ,外部 socat
调用不返回任何内容。有没有办法返回外部 tee
的 socat
值之一?
解决方法
该问题的一个潜在解决方案是创建一个处理程序脚本,该脚本接受 TCP 侦听输入并对其进行处理。
router.sh:
socat TCP-LISTEN:8080,fork,reuseaddr EXEC:"bash -e ./route_handler.sh"
route_handler.sh:
tee >(socat - TCP4:127.0.0.1:8001 >> /dev/null) | socat - TCP4:127.0.0.1:8000
当端口 8080
被命中时,结果被发送到本地主机端口 8000
和 8001
被调用。端口 8000
的输出返回给 TCP 侦听器。