我正试图扫描域进行渗透测试,程序使用Multiprocessing与结果列表从进程传递;返回主函数
我试图在class
中也使用global
中提到的全局变量。使用这个提醒我,进程位于不同的内存中。所以我用manager.list()
代替;在进程之间共享内存
这是我尝试过的:
from multiprocessing import Process, cpu_count, Manager
class variably:
variably=bla..
....
def engine(domainlist, R):
for domain in domainlist:
try:
r = requests.get("http://" + domain, headers=headers, timeout=0.7, allow_redirects=False)
if r.status_code == expected_response:
print("Success" + domain)
print(domain, file=open("LazyWritesForDebugPurposes.txt", "a"))
R.append(str(domain))
elif r.status_code != expected_response:
print("Failed" + domain + str(r.status_code))
except:
pass
def fromtext():
....
R = []
with Manager() as manager:
num_cpus = cpu_count()
processes = []
R = manager.list()
for process_num in range(num_cpus):
section = domainlist[process_num::num_cpus]
p = Process(target=engine, args=(section,R,))
p.start()
processes.append(p)
for p in processes:
p.join()
print(R)
print(R)
print("")
print(" Total of Domains Queried : " + colors.RED_BG + " "+str(len(R)) +" "+ colors.ENDC)
if len(inf.result_success) >= 0:
print(" Successfull Result : " + colors.GREEN_BG + " "+str(len(R))+ " "+colors.ENDC)
fromtext()
抱歉任何无效的语法或缩进,试图将代码简化为更短的代码片段。
以上代码返回BrokenPipe
,有时ConnectionRefused
错误。从异常中,我可以看到列表已经附加为:['Domain.com','Domain_2.com']
,但不知何故引发了一个异常。
下面是一些关于这个问题的截图:有问题的截图
<标题>编辑:看起来列表只能在manager()
范围内传递,我如何扩展在范围外传递的数据,例如在不同的函数中调用列表。下面的代码可以工作:
with Manager() as manager:
num_cpus = cpu_count()
processes = []
R = manager.list()
for process_num in range(num_cpus):
section = domainlist[process_num::num_cpus]
p = Process(target=engine, args=(section,R,))
p.start()
processes.append(p)
for p in processes:
p.join()
str(len(R))
标题>您确实需要使用队列。在主线程中创建一个multiprocessing.SimpleQueue
,并将其传递给所有子进程。他们可以向这个队列添加项目。
创建自己的管理器几乎总是一个错误。
问题是,我必须通过设置一个新变量显式地将manager.list()
转换为另一个正常列表,并使用global
使其在另一个函数中可用。我知道它很脏,没有尝试使用Queue()
,但现在,至少它是工作的。
def executor():
global R
....
with Manager() as manager:
num_cpus = cpu_count()
processes = []
R = manager.list()
for process_num in range(num_cpus):
section = domainlist[process_num::num_cpus]
p = Process(target=engine, args=(section,R,))
p.start()
processes.append(p)
for p in processes:
p.join()
R = list(R)
print(R)
如果能简化一下,我将非常感激。