You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化IP漏洞扫描脚本,解决大子网下数组内存占用过高问题

优化方案

你的猜测完全正确,预先生成所有IP存入全局数组是内存占用过高的核心原因,1600万条字符串的存储成本加上进程池任务队列的积压开销,最终导致内存占用达到数GB。

核心优化点

  • 废弃预先生成全量IP数组的逻辑:ipaddress.IPv4Network本身就是可迭代的生成器对象,无需提前转成列表存储所有IP,迭代过程中动态生成IP并提交任务即可,内存占用可以直接降低90%以上。
  • 控制进程池任务队列长度:即便使用带边界的进程池,一次性提交所有任务仍然会导致队列中积压大量待执行任务的元数据,建议按批次提交任务,每提交1000~2000个任务就等待一批完成,再提交下一批,避免队列占用过多内存。
  • 优化扫描函数的内存开销:requests.get默认会加载完整响应体到内存,你只需要判断响应中是否存在特定字符串,可以改为流式读取响应,无需加载整个页面内容;另外你代码中声明的vulnerable_ip_list全局变量全程未使用,可以直接删除减少不必要的内存占用。
  • 减少不必要的控制台输出:每扫描一个IP就打印一行日志会占用大量输出缓冲区内存,大批量扫描时可以只打印漏洞发现日志,或者每间隔固定数量的IP打印一次进度即可。

优化后代码

import requests
import ipaddress
import sys
from concurrent.futures import as_completed
from bounded_pool_executor import BoundedProcessPoolExecutor
import urllib3
urllib3.disable_warnings()

header = { 'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'}
BATCH_SIZE = 1000  # 可根据服务器性能调整批次大小

if len(sys.argv) < 3:
    print("Missing argument...")
    exit()

def scan_ip(ip):
    host = f"http://{ip}/vulnerableurl/"
    try:
        # 流式读取响应,不加载完整响应体到内存
        with requests.get(host, headers=header, verify=False, timeout=5, stream=True) as r:
            # 逐块读取响应,匹配到目标字符串就停止读取
            for chunk in r.iter_content(chunk_size=1024, decode_unicode=True):
                if 'vulnerable page' in chunk.lower():
                    print(f'Vulnerability found on: {host}')
                    with open("output.txt", "a") as txt_file:
                        txt_file.write(host + "\n")
                    break
    except Exception:
        pass

if __name__ == "__main__":
    subnet = sys.argv[1]
    max_workers = int(sys.argv[2])
    print(f"Initializing scan for subnet: {subnet}")
    print(f"Using {max_workers} processes")
    
    # 直接迭代IP生成器,不预存全量IP到内存
    ip_iter = iter(ipaddress.IPv4Network(subnet))
    with BoundedProcessPoolExecutor(max_workers=max_workers) as executor:
        while True:
            futures = []
            # 按批次提交任务
            for _ in range(BATCH_SIZE):
                try:
                    ip = str(next(ip_iter))
                    futures.append(executor.submit(scan_ip, ip))
                except StopIteration:
                    break
            if not futures:
                break
            # 等待当前批次任务全部完成,释放内存后再提交下一批
            for future in as_completed(futures):
                del future

优化后扫描127.0.0.0/8段的内存占用可以控制在500MB以内,不会再出现数GB的内存占用问题。

内容的提问来源于stack exchange,提问作者Gabriel Bigardi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 08:06:04