probabely “loop” and “output” doesn't work properly in my bash script

霸气de小男生 提交于 2019-12-10 12:26:55

问题


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


回答1:


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



回答2:


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).



来源:https://stackoverflow.com/questions/21622851/probabely-loop-and-output-doesnt-work-properly-in-my-bash-script

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!