所以我希望 socat 持续监听连接,获取前 x 行并回复消息。理想情况下,我想使用用户定义的函数来处理该逻辑,但我找不到实现这一目标的方法。
我的场景:
client 1:
cat <(printf "line1\nline2\n") -|nc socat_server socat_port
client 2:
cat <(printf "line3\nline4\n") -|nc socat_server socat_port
我想得到: line1 和 line3 以及客户端消息(例如 EXIT)
我尝试过:
exec {fd}> >(my_custom_function)
socat tcp-listen:10000,reuseaddr,fork system:"head -n1>&$fd;echo EXIT;exit"
但我得到“错误的FD号码”。有什么办法解决这个问题吗?
答案1
对于{fd}> file
, 的值$fd
将大于 9。
使用system:shell-code
,socat
调用sh
来解释该 shell 代码。
sh
实现不需要在重定向运算符中支持高于 9 的 fd。实施诸如dash
或mksh
不实施。另请注意,ksh93(支持该语法的 zsh 和 bash 的三个 shell 之一)使用exec {fd}> file
close-on-exec 标志标记获得的 fd,因此不会被socat
那里继承。
因此,在这里,您需要使用低于 10 的 fd:
exec 4> >(my_custom_function)
socat tcp-listen:10000,reuseaddr,fork system:"head -n1>&4;echo EXIT;exit"
或者调用您知道支持 9 以上 fds 的 shell,例如 zsh:
exec {fd}> >(my_custom_function)
socat tcp-listen:10000,reuseaddr,fork "exec:'zsh -c \"head -n1>&$fd;echo EXIT;exit\"'"
(不是来自ksh93
)。