-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathscan.sh
executable file
·56 lines (45 loc) · 1.51 KB
/
scan.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
#!/bin/bash
# SSID to match
ssid=$SSID
# Level in dbm. Only networks with higher level values will be counted.
level=${LEVEL:--999}
# Min level for levels array
min_level=${MIN_LEVEL:--100}
# Ssid channel (if SSID specified)
ssid_channel=0
# Networks per channel
networks=(0 0 0 0 0 0 0 0 0 0 0 0 0 0)
# Channel max level
levels=($min_level $min_level $min_level $min_level $min_level $min_level $min_level $min_level $min_level $min_level $min_level $min_level $min_level $min_level)
# Scan and parse
while IFS= read -r line; do
## Test line contenst and parse as required
[[ "$line" =~ Address ]] && mac=${line##*ss: }
[[ "$line" =~ \(Channel ]] && { chn=${line##*nel }; chn=${chn:0:$((${#chn}-1))}; }
[[ "$line" =~ Frequen ]] && { frq=${line##*ncy:}; frq=${frq%% *}; }
[[ "$line" =~ Quality ]] && {
qual=${line##*ity=}
qual=${qual%% *}
lvl=${line##*evel=}
lvl=${lvl%% *}
}
[[ "$line" =~ Encrypt ]] && enc=${line##*key:}
[[ "$line" =~ ESSID ]] && {
essid=${line##*ID:}
# Accumlate networks in channel
if [ $lvl -gt $level ]; then
networks[$chn]=$((networks[$chn]+1));
fi
# Set ssid channel (if specified)
if [[ "$essid" == "\"$ssid\"" ]]; then
ssid_channel=$chn
fi
#
if [ $lvl -gt ${levels[$chn]} ]; then
levels[$chn]="$lvl"
fi
# echo " $mac $essid $frq $chn $qual $lvl $enc" # output after ESSID
}
done
# Return channels scan result
echo $ssid_channel "${networks[@]:1}" "${levels[@]:1}"