我目前正在用 bash 做扫描仪。
这个想法是接收一个网络作为输入,并在遍历它的同时,ping IP 并探测端口以查看它们是否打开。
Var说明(示例):
输入->要扫描的网络:192.168.1.0/24
起始IP:192.168.1.0 -> $i1.$i2.$i3.$i4
最后IP:192.168.1.255 -> $m1.$m2.$m3.$m4
for oct1 in $(seq $i1 1 $m1); do
for oct2 in $(seq $i2 1 $m2); do
for oct3 in $(seq $i3 1 $m3); do
for oct4 in $(seq $i4 1 $m4); do
ping -c 1 $oct1.$oct2.$oct3.$oct4 | grep "64 bytes" | cut -d" " -f4 | tr -d ":" >> scan.txt
nc -nvz $oct1.$oct2.$oct3.$oct4 80 2>&1 | grep succeeded | cut -d" " -f4 >> scan.txt
done
done
done
done
文件scan.txt类似于:
192.168.1.1
80
192.168.1.2
192.168.1.4
192.168.1.5
192.168.1.7
80
192.168.1.9
(...)
我唯一的问题是,这个解决方案虽然有效,但需要太多时间。
扫描 192.168.1.0/24 网络,我发现脚本可以正常启动,但在扫描了大约 10 个 IP 后,它开始变慢,几乎卡住了。
我想这与 ping 和 nc 命令使作业在后台运行有关。如果我添加& disown
到 ping 和 nc 命令的末尾,它会运行得更顺畅,但会导致输出混乱。
而不是从 .1 到 .254,它开始看起来像:
192.168.1.6
80
192.168.1.10
80
80
192.168.1.1
192.168.1.5
192.168.1.3
(...)
可以优化(或以不同方式完成)此代码以更快地运行吗?