-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathnc-scanner.sh
125 lines (114 loc) · 1.69 KB
/
nc-scanner.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/bin/bash
declare -f showHelp
declare -f parse
declare -a ports
declare -a isDigit
declare -a checkArgs
declare -a scan
declare -a main
showHelp()
{
cat <<EOF
usage: $0 [-s server] [-h] <-p port>
-s server
-p port,80 or 1000-2000(from 1000 to 2000) or 22,80(scan 22 and 80)
-h display this help and exit
EOF
exit 1
}
# parse commandline arguments
parse()
{
verbose=false
while getopts ":s:p:h" arg
do
case $arg in
s)
server=$OPTARG
;;
p)
port=$OPTARG
;;
h)
showHelp
;;
:|?|*)
showHelp
;;
esac
done
}
isDigit()
{
if [[ $# -lt 1 ]]
then
return 1
fi
target=$1
if [[ $1 =~ ^[0-9]+$ ]]
then
return 0
else
return 1
fi
}
checkArgs()
{
if [[ -z "$server" ]]
then
server=localhost
fi
while [[ -z "$port" ]]
do
read -p "Please type port: " port
done
split=(${port//-/ }) # split by char '-', return an array.
if [[ ${#split[@]} -ge 2 ]]
then
from=${split[0]}
to=${split[1]}
ports=()
return 0
fi
ports=(${port//,/ }) # split by char ',', return an array.
}
scan()
{
if [[ $# -ge 3 ]]
then
s=$1
f=$2
t=$3
wt=$(seq 10 60 | sort -R | head -n1)
if nc -w $wt -zv $s $f-$t 2>&1 | egrep -q -i "connected|succeeded";then
echo "[+] Success! $s:$p"
else
echo "[-] Fail $s:$p"
fi
elif [[ $# -ge 2 ]]
then
s=$1
p=$2
wt=$(seq 10 60 | sort -R | head -n1)
if nc -zvw $wt $s $p 2>&1 | egrep -q -i "connected|succeeded";then
echo "[+] Success! $s:$p"
else
echo "[-] Fail $s:$p"
fi
fi
}
main()
{
parse $@
checkArgs $@
if [[ ${#ports[@]} -gt 0 ]]
then
for i in ${ports[@]}
do
scan $server $i # I want to use sub-shell, but lead to spend more time
done
else
scan $server $from $to
fi
}
main $@