#!/bin/bash # (1) Init. #--------------------------------------------------------# # (1) Get current absolute dir ROOT=$(dirname `realpath $0`); # (2) Check argc test $# -lt 3 && 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"; # (5) Manage optional 'silent' argument # DEBUG=""; test $# -ge 4 -a "$4" == "debug" && DEBUG="xx"; # (2) Prepare buffer #--------------------------------------------------------# # (1) Create buffer path BUFFER="/tmp/outbuf_$OUT_ID"; # (2) Create/Flush buffer # test -f $BUFFER && rm $BUFFER; echo -n "" > $BUFFER; # (3) Launch OUTPUT server #--------------------------------------------------------# ( [[ $DEBUG ]] && echo " > binding $BUFFER to $OUT_IP:$OUT_PT"; trap "kill -9 $NC_PID 2>/dev/null; exit 1;" HUP INT KILL TERM; outfail=0; # (1) kill script after 10 failures while [ $outfail -lt 10 ]; do # (3) Check if port open nc -z $OUT_IP $OUT_PT >/dev/null 2>&1; PORT_CLOSED=$?; # (4) Manage taken port # if [ "$PORT_CLOSED" -eq "1" ]; then outfail="`expr $outfail + 1`"; test "$outfail" -gt "1" && sleep .5; continue; fi; # (5) Bind output outfail="0"; tail -f $BUFFER | nc $OUT_IP $OUT_PT 2> /dev/null & NC_PID=$!; wait $NC_PID; done; )& LOOP_PID=$!; # (2) Remove buffer + kill loop # on_exit(){ [[ $DEBUG ]] && echo " < closing binding from $BUFFER to $OUT_IP:$OUT_PT"; rm $BUFFER 2>/dev/null && ( [[ $DEBUG ]] && echo " < $BUFFER deleted" ); kill -INT $LOOP_PID 2>/dev/null; exit 1; } trap "on_exit;" HUP INT KILL TERM; wait $LOOP_PID; on_exit;