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