probabely “loop” and “output” doesn't work pro

2019-06-14 19:19发布

I wrote the following script:

#!/bin/bash

echo "Reading data - headers - both"

if [ $# -ne 3 ]; then
    echo "Usage: ./nmap <port-range> <ip-list> <d || h || b>"
    exit 1
fi

rm -f /tmp/right.txt 1>/dev/null 2>/dev/null
rm -f /tmp/wrong.txt 1>/dev/null 2>/dev/null

output=""
if [ $3 == h ]; then
    while read -r -u3 port; do
    while read -r -u4 ip; do
#       echo -en "\n$ip $port: "
        OUT=$( nmap -p "$port" --script=http-headers.nse "$ip" | awk 'NR>=7 && NR<=10')
     #   [[ $OUT == *Apache* ]] && $(echo -en "$ip  $port\n" >> /tmp/right.txt) || $(echo -en "$ip  $port\n" >> /tmp/wrong.txt)
        [[ $OUT == *Apache* ]] && output="$output `echo -en "\n$ip -------------------- $port "`" && echo -e "$output" | column -t >> /tmp/right.txt || output="$output `echo -en "\n$ip -------------------- $port "`" && echo -e "$output" | column -t >> /tmp/wrong.txt
    done 4< "$2"
    done 3< "$1"

    echo -e "$output" | column -t

elif [ $3 == d ]; then
    echo data
elif [ $3 == b ]; then 
    echo both
fi

I expect my output have two files:

cat right.txt
ip1 ..... port1
ip2 ..... port1
ip2 ..... port2
ip3 ..... port3
.
.
.

cat wrong.txt
ip1 ..... port1
ip2 ..... port1
ip2 ..... port2
ip3 ..... port3
.
.
.

but it doesn't work properly...

any idea?

Thank you in advance

2条回答
Animai°情兽
2楼-- · 2019-06-14 19:58

please find updated answer as i modified the BMW's answer for you please check it.

   #!/bin/bash

    echo "Reading data - headers - both"

    if [ $# -ne 3 ]; then
        echo "Usage: ./nmap <port-range> <ip-list> <d || h || b>"
        exit 1
    fi

    join -j 2 $2 $1 > temp.txt

    headers() 
    {
         while read -r ip port
         do
            printf "ip: %s  port:%d \n" $ip $port
            OUT=$(nmap -p "$port" --script=http-headers.nse "$ip" | tac | awk -F: 'NR<=13&&/Apache/{print $2; exit}')   
            if [[ "$OUT" == *Apache* ]]; then
                echo $ip $port >> /tmp/right.txt
            else
                echo $ip $port >> /tmp/wrong.txt
            fi
         done < temp.txt
    } 

    case $3 in 
      "h") headers ;;
      "d") echo data;;
      "b") echo both;;
      "*") echo "wrong input"
           exit;;
    esac
查看更多
Viruses.
3楼-- · 2019-06-14 20:12

Your short-circuit logic is flawed. true && false || true && true will execute all four statements.

It's not clear why you think the output status of echo would indicate anything except success anyway.

Is this closer to what you mean?

output="$output `echo -en "\n$ip -------------------- $port "`"

[[ $OUT == *Apache* ]] && file=/tmp/right.txt || file=/tmp/wrong.txt

echo -e "$output" | column -t >>"$file"

This is still wrong because it will echo the accumulated output multiple times, but at least it should show you what needs to be changed (and also how to refactor your code to avoid repetitions).

I guess you actually want something like

[[ $OUT == *Apache* ]] && file=/tmp/right.txt || file=/tmp/wrong.txt
output="$output `echo -en "\n$ip -------------------- $port " | tee -a "$file"`"

except this doesn't run the copy in the file through column -t. But you can do that later, or add it here and avoid it later (you seem to be running it for all instances of the output in the end anyway).

查看更多
登录 后发表回答