Bash扫描仪优化



我目前正在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命令让作业在后台运行有关。如果我在ping和nc命令的末尾添加& disown,它会运行得更平稳,但会干扰输出。

它不是从.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
(...)

为了更快地运行,是否可以优化(或以不同方式执行(此代码?

ping-c 1$oct1.$oct2.$oct3.$oct4|grep"64字节"|切割-d"&quot-f4|tr-d":"gt>scan.txt

当ping不产生";64字节";消息你的剧本停了很长一段时间。在我的系统上,失败需要10秒,但我不确定这个超时是否有什么特别标准。

$ time ping -c1 192.168.0.123
PING 192.168.0.123 (192.168.0.123) 56(84) bytes of data.
--- 192.168.0.123 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

real    0m10.004s
user    0m0.000s
sys     0m0.000s

目前大多数Linux发行版都包含超时(1(,因此您可以限制脚本等待的时间:

$ timeout 2 ping -c1 192.168.0.123 || echo no
PING 192.168.0.123 (192.168.0.123) 56(84) bytes of data.
no

对于并发处理(一次ping多个主机(,可以考虑使用make(1(和-j选项。使用脚本生成一组地址,每个地址都有一个文件名,然后定义Makefile规则为每个输入生成一个输出文件。作为最后一步,将所有输出连接在一起。

如果您的输入文件是.ping,输出文件是.pong,那么一条规则如下:

.ping.pong:
ping -c 1 $^ 
| grep "64 bytes" 
| cut -d" " -f4 
| tr -d ":" > $@~
nc -nvz $^ 80 2>&1 
| grep succeeded | cut -d" " -f4 >> $@~
mv $@~ $@

将";编译";将每个.ping文件转换为.pong文件。(以上内容不太适用,因为您需要从文件名中删除后缀以用作命令行参数。(

最后一句建议:如果你发现自己在管道中使用grep、cut、sed和tr,awk(1(就是你的朋友。原因有100个,但也许最好的一个是你可以轻松地编写awk脚本,让意外的输入"跌倒";使用grep,所有意想不到的东西都会被丢弃,让你猜测(或问SO(缺少了什么。

最新更新