基于Python开发的跨平台Nmap自动化扫描工具

雨后青山
雨后青山
发布时间:2026-10-10 | 4人浏览过
原创

本文详细介绍如何使用Python内置模块封装Nmap命令行指令,开发一套支持Windows、Linux和macOS的自动化网络扫描工具。通过正则解析gnmap格式、统一子进程管理及交互式菜单设计,解决手动敲命令繁琐、跨平台命令不兼容等问题,并提供完整代码实现、运行步骤及扩展优化方案。

目标与核心功能

手动调用Nmap进行网络探测时,参数组合复杂且易出错,不同操作系统下的文本处理命令(如Linux的grep与Windows的findstr)也缺乏一致性。本工具将常见扫描场景封装为Python脚本,提供以下核心能力:

  • 存活主机探测:快速定位网段在线设备
  • 全端口扫描:深度检测0至65535端口开放状态
  • 常用端口扫描:默认优先检测Top 100高频端口
  • 操作系统探测:识别目标主机系统类型
  • 服务版本检测:获取端口对应的软件及版本号
  • 漏洞辅助检测:针对特定风险(如永恒之蓝SMB相关漏洞)进行专项排查

准备条件:环境与依赖配置

工具完全依赖Python标准库,无需安装第三方包。使用前需完成以下环境配置:

1. 安装并配置Nmap

  • Windows:下载安装包,安装向导中务必勾选 Add Nmap to the system PATH for all users。
  • Linux(Ubuntu/Debian):终端执行 sudo apt-get install nmap。
  • macOS:通过Homebrew执行 brew install nmap。

验证配置是否生效:打开终端或CMD输入 nmap -v,正常输出版本信息即表示环境变量配置正确。

2. 准备Python运行环境

确保系统已安装Python 3.6及以上版本(推荐3.8+)。脚本仅调用 subprocess、os、sys、re、typing 等内置模块,开箱即用。

代码实现步骤:从执行封装到菜单路由

第1步:校验运行环境可用性

启动脚本前强制检测Nmap是否可用,阻断后续无效调用:

import subprocess
import sys

def check_nmap_installed() -> bool:
    """检查 Nmap 是否安装并加入环境变量"""
    try:
        result = subprocess.run(
            ["nmap", "-v"],
            capture_output=True,
            text=True,
            timeout=5
        )
        return result.returncode == 0
    except (subprocess.TimeoutExpired, FileNotFoundError):
        return False

if __name__ == "__main__":
    if not check_nmap_installed():
        print("❌ 错误:未检测到 Nmap,请先安装并加入环境变量!")
        sys.exit(1)

第2步:封装命令执行与实时日志输出

统一管理子进程调用,支持流式打印扫描进度并捕获异常:

def execute_command(cmd: list[str], desc: str) -> bool:
    """执行系统命令并输出日志"""
    print(f"\n=== 开始执行:{desc} ===")
    print(f"执行命令:{' '.join(cmd)}")
    try:
        process = subprocess.Popen(
            cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            text=True,
            bufsize=1
        )
        for line in iter(process.stdout.readline, ''):
            print(line.strip())
        process.wait()
        return process.returncode == 0
    except Exception as e:
        print(f"执行异常:{str(e)}")
        return False

第3步:实现跨平台存活主机探测

利用Nmap输出的gnmap格式配合正则表达式提取IP,避开Windows缺少grep/cut命令的限制:

import re
import os

def discover_live_hosts(network: str = "192.168.1.0/24") -> bool:
    """探测存活主机(跨平台版)"""
    cmd = ["nmap", "-sn", "-v", "-T4", "-oG", "Discovery.gnmap", network]
    if not execute_command(cmd, "存活主机探测"):
        return False

    live_hosts = []
    try:
        with open("Discovery.gnmap", "r", encoding="utf-8") as f:
            for line in f:
                if "Status: Up" in line:
                    ip_match = re.search(r"Host: (\d+\.\d+\.\d+\.\d+)", line)
                    if ip_match:
                        live_hosts.append(ip_match.group(1))
    except Exception as e:
        print(f"解析失败:{str(e)}")
        return False

    if live_hosts:
        with open("liveHosts.txt", "w", encoding="utf-8") as f:
            f.write("\n".join(live_hosts))
        print(f"✅ 发现 {len(live_hosts)} 台存活主机,已写入liveHosts.txt")
        return True
    else:
        print("❌ 未发现存活主机")
        return False

第4步:构建可视化交互菜单

将底层逻辑包装为数字选项,屏蔽复杂参数记忆成本:

def main_menu():
    """主菜单"""
    print("=" * 50)
    print("        Nmap 自动化扫描工具")
    print("=" * 50)
    print("1. 探测存活主机(生成 liveHosts.txt)")
    print("2. 全端口扫描(基于 liveHosts.txt)")
    print("3. 常用端口扫描(基于 liveHosts.txt)")
    print("4. 操作系统探测(基于 liveHosts.txt)")
    print("5. 服务版本检测(基于 liveHosts.txt)")
    print("6. SMB Ghost 漏洞扫描")
    print("0. 退出程序")
    print("=" * 50)

while True:
    main_menu()
    choice = input("请输入操作编号:").strip()
    if choice == "0":
        print("👋 程序退出!")
        break
    # 对应功能的分支调用逻辑在此处补充

使用操作与结果验证

将上述模块合并保存为 nmap_auto_scan.py。在终端进入文件所在目录,执行 python nmap_auto_scan.py。通过菜单选项依次执行即可自动完成任务。

运行过程中会自动生成以下结果文件用于核对数据:

文件名用途说明
liveHosts.txt存活主机IP列表
Discovery.gnmap存活探测原始数据
FullTCP / TopTCP全端口/常用端口扫描结果
OSDetect / ServiceDetect系统与版本检测结果

排错提示与安全规范

在使用该自动化脚本时,请注意以下关键事项以避免误操作或法律风险:

  • 合法授权:仅限拥有明确书面授权的网络环境进行测试,违规扫描可能触犯相关法律法规。
  • 频率控制:公网环境建议改用 -T2 降低速度以免触发封禁或造成拥塞,内网测试可使用 -T4。
  • 权限要求:Linux/macOS下进行TCP SYN扫描(-sS)必须具备root权限,执行时需加 sudo python nmap_auto_scan.py。
  • 结果核实:Nmap的版本与系统探测基于指纹匹配,并非100%准确,生产环境需结合其他手段交叉验证。

扩展优化建议

基础版本满足常规巡检需求,可根据实际业务进一步升级:

  • 并发加速:利用 -min-parallelism 参数提升单次扫描线程数,或使用Python多线程并行处理多个网段。
  • 自定义超时与重试:网络波动时增加自动重试逻辑,避免单次失败导致任务中断。
  • 报表导出:引入 pandas 将结构化数据导出为Excel,或结合可视化工具生成端口分布图表。
  • 灵活参数注入:允许用户动态输入扫描速率(-T0~-T5)与目标范围,增强脚本适配性。

总结

通过Python标准库对Nmap命令行进行流程化封装,可有效消除手动输参的记忆负担与跨平台兼容性障碍。结合正则解析与交互式界面,运维与安全测试人员能更高效地获取网络拓扑与资产信息。以上就是基于Python开发的跨平台Nmap自动化扫描工具的详细内容,更多关于网络安全自动化扫描的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表