socat 与用户定义的 bash 函数进行双向通信

socat 与用户定义的 bash 函数进行双向通信

所以我希望 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。实施诸如dashmksh不实施。另请注意,ksh93(支持该语法的 zsh 和 bash 的三个 shell 之一)使用exec {fd}> fileclose-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)。

相关内容