#!/bin/bash # (1) Init. #--------------------------------------------------------# # (1) Get current absolute dir ROOT=$(dirname `realpath $0`); # (2) Check argc test $# -lt 2 && echo -e "error: too fewarguments\n\n\e[1mUSAGE\e[0m\n\tbind-output \n\n\e[1mARGUMENTS\e[0m\n\t\tThe identifier of the output (buffer name)\n\t\tThe ip or host of the target\n\t\tThe port to connect to\n" && exit 1; # (3) Check @PORT range # MIN_PORT=1024; MAX_PORT=49151; test "$3" -gt "$MAX_PORT" -o "$3" -lt "$MIN_PORT" && echo "error: must be between $MIN_PORT and $MAX_PORT" && exit 1; # (4) Set argument explicit names # OUT_ID="$1"; OUT_IP="$2"; OUT_PT="$3"; # (2) Prepare buffer #--------------------------------------------------------# # (1) Create buffer path BUFFER="/tmp/outbuf_$OUT_ID"; # (2) Create/Flush buffer test -f $BUFFER && rm $BUFFER; touch $BUFFER; # (3) Launch INPUT server #--------------------------------------------------------# ( trap "kill -9 %1 2>/dev/null" INT KILL; outfail=0; # (1) kill script after 10 failures . while [ $outfail -lt 10 ]; do # (2) bind socket to buffer echo "(.) binding $BUFFER to $OUT_IP:$OUT_PT"; ( tail -f $BUFFER | nc $OUT_IP $OUT_PT 2> /dev/null && outfail="0" || ( outfail=`expr $outfail + 1`; exit 1 ) || echo " * cannot access $OUT_IP:$OUT_PT" )& wait $!; done; )& LOOP_PID=$!; # (2) Remove buffer + kill loop # trap "rm $BUFFER 2>/dev/null; kill -9 $LOOP_PID 2>/dev/null" INT KILL; wait $LOOP_PID;