socat 将标准输入复制到每个连接的客户端

whi*_*nge 6 tcp socat

ncat(来自 nmap 社区)有一个简洁的默认操作,可以将任何输入复制到所有连接的客户端。例如:

在终端 1 上启动服务器:

% mkfifo messages
% exec 8<>messages  # hold the fifo open
% ncat -l 5555 -k --send-only < messages
Run Code Online (Sandbox Code Playgroud)

启动客户端侦听终端 2 和 3:

% nc localhost 5555
Run Code Online (Sandbox Code Playgroud)

向终端 4 上的 fifo 输出一些内容,并观察所有连接的客户端(终端 2 和 3)上出现的相同消息:

% printf 'Hello, clients.\n' > messages
Run Code Online (Sandbox Code Playgroud)

socat 是否可以使用相同的模式?

更新:菲利普的解决方案截图:

在此处输入图片说明

Phi*_*ppe 1

该命令将执行以下操作:

socat tcp-listen:5555,fork,reuseaddr \
'system:
PIPE=$(mktemp -u /tmp/pns_XXX)
mkfifo $PIPE
while read PIPE_MESSAGE<$PIPE; do
  echo $PIPE_MESSAGE
done &
PID=$!
while read CLIENT_MESSAGE; do
  for OTHER_PIPE in $(ls /tmp/pns_*); do
    [ $PIPE != $OTHER_PIPE ] && echo $CLIENT_MESSAGE > $OTHER_PIPE
  done
done
kill $PID
rm $PIPE'
Run Code Online (Sandbox Code Playgroud)

这个想法是为每个新连接创建一个命名管道,然后回显到标准输出(即发送到客户端)从管道中读取的任何内容。读取标准输入(即由客户端发送到服务器),并将接收到的任何内容回显到除自己的管道之外的所有命名管道。