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

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

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

在终端 1 上启动服务器:

% mkfifo messages
% exec 8<>messages  # hold the fifo open
% ncat -l 5555 -k --send-only < messages

启动客户端在终端 2 和 3 上监听:

% nc localhost 5555

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

% printf 'Hello, clients.\n' > messages

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

更新:Philippe的解决方案截图:

在此输入图像描述

答案1

你想做的事情恐怕是不可能的。您可以获得的最接近的是:

在 1 号航站楼:

mkfifo messages
socat PIPE:messages TCP4-LISTEN:5555,fork

在 2 号和 3 号航站楼:

nc localhost 5555

然后,发送到的文本messages有时会出现在终端 2 上,有时会出现在终端 3 上。这是因为在通过 localhost:5555 上打开的套接字提供文本之前,socat将“消耗”文本。messages然后,第一个netcat唤醒并从套接字读取消息的进程将获取消息,而另一个进程则什么也得不到。

答案2

该命令将执行以下操作:

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'

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

相关内容