bash - 处理通过管道传输到 netcat 的脚本的输入

标签 bash sockets fifo netcat

我有一个系统可以处理传入的电子邮件,将它们发送到我工作中的黑盒应用程序。高级脚本由 inittab 维护以始终运行并运行子脚本以使用此命令完成实际工作:

$SCRIPT | nc -l -p $PORT

脚本本身从命名管道读取数据,在调用 echo 之前对数据进行一些解析和处理,以通过 netcat 将数据洗回 $PORT 上连接的进程。

我需要的是某种方法来处理来自管道远端的传入数据。当我在应用程序中发出关闭连接的请求时,它会发回一个字符串(我可以将其定义为任何我想要的)并等待我的脚本关闭管道。我目前正在努力了解如何添加从另一端读取传入数据的功能;验证这是关闭管道的命令,然后退出脚本。

我的脚本(简而言之)如下所示:

while true ; do
  email_input="`cat "$pipe"`"
  if [[ $email_input =~ .*escape_queue.* ]] ; then
    break;
  fi
  echo "`parse`"
done

我对必须改变程序流程的可能性持开放态度,我只是无法理解如何能够异步读取传入的数据,因为脚本在 cat $pipe< 上阻塞 直到收到要处理的新电子邮件。

如果不清楚,我是 bash 脚本的新手,并且总是乐于接受改进建议。

更新 我已将脚本调用更改为

$SCRIPT | nc -l -p $PORT > $nc_data

在脚本本身中

netcat_response="`cat "$nc_data"`";
if [[ "$netcat_response" =~ "exit" ]] ; then
  cat /dev/null > $nc_data
  break;
fi

此时,一旦新消息通过管道传输到 fifo,脚本就会终止。这意味着我总是会丢失 1 条消息,因为它被脚本读取,然后脚本终止。该脚本仍然阻塞在 cat 上,直到读取到某些内容。这将是最坏的情况。

最佳答案

您可以让 nc 在标准输入的 EOF 一定时间后退出。

$SCRIPT | nc -l -q 5 -p $PORT > $nc_data

-q 是在一定秒数后退出的选项。

关于bash - 处理通过管道传输到 netcat 的脚本的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10654586/

相关文章:

perl - 命令行枢轴

java - 如何返回 CloseableHttpResponse?

c - C中的管道/FIFO清除

bash - 从两个不同的脚本写入和读取 fifo

linux - 需要一种临时重定向 STDOUT 的方法

regex - sed:在匹配之前显示行

sockets - Android Socket.bind 的 TCP 服务器单声道

使用 select() 连续读取 FIFO

perl - 如何根据一组行的列的最低值对文本文件的内容进行排序

python - 如何使客户端套接字以非阻塞方式从另一个套接字接收数据?