Vip*_*non 2 linux command-line networking tee
这可能是一个非常基本的问题。
想知道在 Linux 中是否有一个命令可以像 tee 命令一样工作,但用于转发 TCP/UDP 数据包。基本上它应该在一个端口上侦听并“tee”/将相同的数据/数据包转发到此“tee”类组件后面配置的所有其他主机。
如果不是命令,那么推荐的相同设置是什么?
netcat 或 socat 能做到这一点吗?
网络通信通常是双向的,tee
而 shell 管道只能以单向方式工作。
但是,如果您有一些只接收数据而从不发回数据的网络服务,您可以使用zsh
+将相同的字节流通过 TCP 发送给所有这些服务,socat
例如:
generate-stream > >(socat -u - tcp:host:8001) > >(socat -u - tcp:host:8002)
Run Code Online (Sandbox Code Playgroud)
或者使用其他支持进程替换但不支持 multios 的 shell:
generate-stream | tee >(socat -u - tcp:host:8001) | socat -u - tcp:host:8002
Run Code Online (Sandbox Code Playgroud)
现在将它挂接到一个接受传入连接并转发接收到的流量的服务中 tee
方式,您可以执行以下操作:
CODE='
cat > >(socat -u - tcp:host:8001) > >(socat -u - tcp:host:8002)
' socat -u tcp-listen:8000,fork,reuseaddr \
exec:'zsh -c eval\\ $CODE',nofork
Run Code Online (Sandbox Code Playgroud)
这里启动一个服务,通过 TCP 端口 8000(以单向方式)接收流量并将其转发到 TCP 端口 8001 和 8002 上的服务器 host
。
该nofork
是没有必要的,它只是一个优化具有zsh
的直接标准输入是网络套接字。
或者,如果您没有zsh
但有bash
:
CODE='
tee >(socat -u - tcp:host:8001) | socat -u - tcp:host:8002
' socat -u tcp-listen:8000,fork,reuseaddr \
exec:'bash -c eval\\ \\\"$CODE\\\"',nofork
Run Code Online (Sandbox Code Playgroud)
这可以适应由支持的许多其他传输协议中的任何一个 socat
.
您可以zsh
为此编写一个辅助函数,例如:
ntee() (
src=$1; shift
export CODE=cat
for dst do
CODE+=" > >(socat -u - ${(qq)dst})"
done
socat -u "$src" exec:'zsh -c eval\\ $CODE',nofork
)
Run Code Online (Sandbox Code Playgroud)
并将其用作:
ntee tcp-listen:8000,reuseaddr,fork \
tcp:host1:8001 \
udp-sendto:host2:8002 \
file:file.log,creat,append
Run Code Online (Sandbox Code Playgroud)
例如。