【发布时间】:2015-12-26 15:59:58
【问题描述】:
脚本的总体目标是对 /8 网络进行有效的 ping。为此,我同时运行 32 个脚本来扫描每个 /13。
脚本的基础是
import ipaddress
import time
import fileinput
import pingpack
set = 0
mainset =0
while mainset < 8:
while set < 256:
net_addr = ("10.{}.{}.0/24".format(mainset,set))
ip_net = ipaddress.ip_network(net_addr)
all_hosts = list(ip_net.hosts())
f_out_file=('{}_Ping.txt'.format(mainset))
for i in range(len(all_hosts)):
output = pingpack.ping("{}".format(all_hosts[i]))
if output != None:
with open(f_out_file,'a',newline="\n") as file:
file.write("{}, Y\r\n".format(all_hosts[i]))
print ("{}".format("Subnet Complete"))
set = set + 1
set=0
它自己运行和运行的脚本在它自己运行时给我一个很好的输出。我遇到的问题是,当我为每个子网运行其中的 32 个时,它们在 python 进程锁定并停止写入之前运行了大约 8 个设置循环。
我用来启动32的脚本如下
from subprocess import Popen, PIPE
import time
i = 0
count=0
while i < 32:
process = Popen(['ping{}.py'.format(i),"{}".format(count)], stdout=PIPE, stderr=PIPE, shell=True)
print(count)
print(i)
i = i + 1
count=count+8
time.sleep(1)
在这种情况下;是的;我确实有 32 个重复的脚本,每个脚本有 2 行针对不同的 /13 子项进行了更改。它可能和一些一样有效;但它让他们开始并运行。
我将如何找到这些脚本停止的原因?
旁注:是的,我知道我可以使用 NMAP 或 Angry IP Scanner 之类的工具来做到这一点;但他们都需要 90 多个小时来扫描整个 /8;我正在尝试将其缩短为可以在更合理的时间范围内运行的内容。
【问题讨论】:
-
我怀疑你会击败 nmap 的性能 - 他们有一个多线程/并行模式来帮助提高吞吐量:nmap.org/book/man-performance.html
-
你用的是什么操作系统?
-
@AlastairMcCormack 我遇到namp的问题是我在东主机上进行了双重扫描(发现然后端口扫描);最重要的是,如果该过程中途中断,我将丢失所有数据;在 python 中,我可以不断地写入文件并且不会丢失数据。
-
@PadraicCunningham 我正在运行 Windows 7,遗憾的是无法访问网络上的 linux 发行版;我认为一个简单的 bash 脚本可以比 python 更快、更干净,但这不是一个选择。
-
@AlastairMcCormack 扩展命令并使用并行性; nmap -sn --min-parallelism 100 -T5 -oN c:/dump/nmapscan.txt 10.0.0.0/8 看起来是 48 小时的 ping 跨度。从我所看到的情况来看,即使某些主机发现也无法更快地推送。这仍然比 python 脚本(运行在 32 个进程 vs namp)更快,并且仍然比愤怒的 ip 扫描器更快。如果我能让 python 脚本并行运行 64 或 128,那么 python 可能会更快。
标签: python subprocess popen