可能“循环”和“输出”在我的bash脚本中无法正常工作

时间:2014-02-07 08:33:53

标签: linux bash loops awk nmap

我写了以下脚本:

#!/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

我希望我的输出有两个文件:

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

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

但它无法正常工作......

任何想法?

提前谢谢

2 个答案:

答案 0 :(得分:1)

请找到更新的答案,因为我为您修改了宝马的答案,请检查。

   #!/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

答案 1 :(得分:0)

您的短路逻辑存在缺陷。 true && false || true && true将执行所有四个语句。

目前尚不清楚为什么你认为echo的输出状态会表明除了成功之外的任何事情。

这更接近你的意思吗?

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

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

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

这仍然是错误的,因为它会多次回显累积的output,但至少它应该显示需要更改的内容(以及如何重构代码以避免重复)。

我猜你其实想要像

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

除了这不通过column -t在文件中运行副本。但是你可以稍后再这样做,或者在这里添加它并在以后避免它(无论如何你似乎都在为所有输出实例运行它)。