处理从管道传输到netcat的脚本输入

时间:2012-05-18 14:33:45

标签: 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上阻塞,直到读取内容为止。最糟糕的情况就是必须这样做。

1 个答案:

答案 0 :(得分:3)

你可以在stdin的EOF中经过一段时间后退出。

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

-q是在一定时间后退出的选项。