Ebbez
Ebbez

Reputation: 364

netcat inside a while read loop returning immediately

I am making a menu for myself, because sometimes I need to search (Or NMAP which port). I want to do the same as running the command in the command line.

Here is a piece of my code:

nmap $1 | grep open | while read line; do
    serviceport=$(echo $line | cut -d' ' -f1 | cut -d'/' -f1);
    if [ $i -eq $choice ]; then
        echo "Running command: netcat $1 $serviceport";
        netcat $1 $serviceport;
    fi;
    i=$(($i+1));
done;

It is closing immediately after it scanned everything with nmap.

Upvotes: 0

Views: 2109

Answers (1)

Charles Duffy
Charles Duffy

Reputation: 295716

Don't use FD 0 (stdin) for both your read loop and netcat. If you don't distinguish these streams, netcat can consume content emitted by the nmap | grep pipeline rather than leaving that content to be read by read.

This has a few undesirable effects: Further parts of the while/read loop don't get executed, and netcat sees a closed stdin stream and exits when the pipeline's contents are consumed (so you don't get interactive control of netcat, if that's what you're trying to accomplish). An easy way to work around this issue is to feed the output of your nmap pipeline in on a non-default file descriptor; below, I'm using FD 3.

There's a lot wrong with this code beyond the scope of the question, so please don't consider the parts I've copied-and-pasted an endorsement, but:

while read -r -u 3 line; do
    serviceport=${line%% *}; serviceport=${serviceport##/*}
    if [ "$i" -eq "$choice" ]; then
        echo "Running command: netcat $1 $serviceport"
        netcat "$1" "$serviceport"
    fi
done 3< <(nmap "$1" | grep open)

Upvotes: 1

Related Questions