我写了以下脚本:
#!/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 $portn" >> /tmp/right.txt) || $(echo -en "$ip $portn" >> /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
.
.
.
但是它无法正常工作...
有什么想法吗?
预先感谢您
请在我修改宝马答案时找到更新的答案,请检查。
#!/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
您的短路逻辑有缺陷。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
运行文件中的副本。但是您稍后可以这样做,或在此处添加并避免使用(无论如何,您似乎都在输出的所有实例中运行它)。