谢谢你的阅读。请原谅我的英语,我是法语。这是一个理由吗?
我的函数的目的是在 Python3 中通过多处理/线程(不要,我预见到你,不要!)扫描许多 IPv4:PORT,发送 SYN 并注册任何结果。此处调用 Multisomething 是因为等待任何潜在回复需要超时。所以。
这个函数称为生产者。它将潜在的 TCP 连接存储到数据库中。消费者 然后读取数据库并独立进行一些渗透测试。所以。
我准备了一个 IPv4 列表。这是一个包含 10 个 K 元素的随机有效 IP 列表。请记住,每个 IPv4 有 65K 端口要测试。
然后我的方法是为每个启动的生产者使用一个新种子来对列表端口进行混洗。我有很多。每个都有一个有效的 IPv4 列表,但是,如果我们考虑 65K 端口和 100K IP,我们有 6.5G 元素要传递。
为什么 ?
IP[]
是random.shuffle()
-like,按构造。Ports[]
太。
如果我阅读p in Ports
并为每个p
,加入IPv4:Ports
并附加到params[]
,我可以通过启动并行化作业scan(u) for u in params[]
我通过run(rounds)
这样的方式启动它:
def run(rounds):
for r in rounds:
scan(r)
但是,问题是size(rounds)
= size(params)
~ 6.5G 元素
我找不到将如此巨大的参数(大列表)传递给并行化作业的有效(内存对话)方式。我的内存快用完了。
我不是在问如何在一个令人兴奋的工作站上管理它,虽然在纸上设计了这个功能,但它不适合 raspi2 ( 1GB mem )。
我自己根本不需要 Python3,它是一个教学产品。因此,我被困住了。
我的问题是:你能帮我找到一种有效的方法来通过一个并行化的函数来攻击一个巨大的列表,该函数在不通过参数发送列表的情况下弹出列表?
我用谷歌搜索,关注了我知道的论坛和线程,但是,当我重构程序时,不断的问题仍然存在,在main()的同一个地方嘲笑我。
我不想重现的内容:
MAX_IPV4 = i.IPv4Address._ALL_ONES
MAX_PORT = 65535
def r_ipv4():
while True:
a=i.IPv4Address._string_from_ip_int(r.randint(0, MAX_IPV4))
b=i.IPv4Address(a)
if b.is_multicast or b.is_private or b.is_loopback or b.is_reserved or b.is_link_local :
continue
else :
return a
break
def generate_target():
return r_ipv4()
def generate_r_targets(n):
ip=[]
for i in range(0,n):
ip.append(generate_target())
ports=[]
for p in range(1,65535):
ports.append(p)
r.shuffle(ports)
targets=[]
for p in ports:
for z in ip:
targets.append((str(z)+","+str(p)))
这不是我的最佳方法,而是我可以解释和展示问题的最佳方式。
我不想丢失(改组的端口)可迭代,它是我的主要向量,它是核心。我正在测试 knockd 的动态配置。
说。Computer_one 在 knockd 中注册一个序列。Computer_one 是唯一知道种子的人。种子是knockd的key序列的key,这样就完成了。