Handling input from script piped to netcat

bash, fifo, netcat, sockets

Solution

You can have nc quit after a certain time from the EOF of stdin.

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

`-q` being the option to quit after a certain amount of seconds.

Problem

I have a system that handles incoming emails to send them to a blackbox application at my job. The high level script is maintained by inittab to always run and runs a child script to do the actual work with this command: ``` $SCRIPT | nc -l -p $PORT ``` The script itself reads from a named pipe, does a bit of parsing and processing of the data before calling `echo` to shuffle the data back through netcat to the process connected on $PORT. What I need is some method to handle incoming data from the far end of my pipe. When I make a request within the application to close the connection it sends back a string (I can define it to whatever I want) and waits for my script to close the pipe. I currently am struggling to understand how I can add in the functionality to read incoming data from the other end; verify it is the command to close the pipe, and then exit the script. My script (in a nutshell) looks like this: ``` while true ; do email_input="`cat "$pipe"`" if [[ $email_input =~ .*escape_queue.* ]] ; then break; fi echo "`parse`" done ``` I'm open to the possibility of having to alter the program flow, I just can't wrap my head around how I would be able to read the data incoming asynchronously since the script blocks on `cat $pipe` until a new email is received to process. If its not clear, I'm at a novice level with bash scripting and am always open to suggestions for improvement. UPDATE I've changed my script call to ``` $SCRIPT | nc -l -p $PORT > $nc_data ``` and within the script itself ``` netcat_response="`cat "$nc_data"`"; if [[ "$netcat_response" =~ "exit" ]] ; then cat /dev/null > $nc_data break; fi ``` At this point the script terminates once a new message is piped into the fifo. This means that I will always lose 1 message as it gets read by the script and then the script terminates. The script still blocks on the `cat` until something is read. Worst case scenario this will have to do.

Original source

Related problems