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

求助:Python解析Nmap XML输出及终端显示方法(对接Tkinter)

解决方案

方法一:用Python标准库解析Nmap XML输出

如果已经生成了XML扫描文件,直接用Python自带的xml.etree.ElementTree就能解析,不需要额外安装依赖。以下是完整代码:

import xml.etree.ElementTree as ET

# 替换成你的XML文件路径
scan_xml_path = "nmap_scan.xml"

try:
    # 加载并解析XML
    tree = ET.parse(scan_xml_path)
    root = tree.getroot()

    # 遍历每台被扫描的主机
    for host in root.findall("host"):
        # 提取IP地址
        ip = host.find("address").attrib["addr"]
        
        # 提取主机名(如果存在)
        hostname_node = host.find("hostnames/hostname")
        hostname = hostname_node.attrib["name"] if hostname_node is not None else "未获取到主机名"
        
        # 提取开放端口
        open_ports = []
        ports_section = host.find("ports")
        if ports_section is not None:
            for port in ports_section.findall("port"):
                port_state = port.find("state").attrib["state"]
                if port_state == "open":
                    port_num = port.attrib["portid"]
                    protocol = port.attrib["protocol"]
                    open_ports.append(f"{port_num}/{protocol}")
        
        # 终端打印结果
        print(f"IP地址: {ip}")
        print(f"主机名: {hostname}")
        print(f"开放端口: {', '.join(open_ports) if open_ports else '无开放端口'}")
        print("-" * 40)

except FileNotFoundError:
    print(f"错误:未找到文件 {scan_xml_path}")
except Exception as e:
    print(f"解析出错:{str(e)}")

代码说明

  • 先加载XML文件,通过节点路径定位到host标签,每一个host对应一台被扫描的设备
  • IP地址存放在address标签的addr属性中
  • 主机名在hostnames/hostname标签的name属性里(如果Nmap没探测到就显示默认文本)
  • 遍历ports下的所有port标签,只收集state为open的端口,同时记录端口号和协议

方法二:用python-nmap库直接处理扫描(更简便)

如果还没生成XML文件,推荐用python-nmap库——它能直接调用Nmap命令并返回结构化的扫描结果,省去手动解析XML的麻烦。

步骤1:安装依赖

pip install python-nmap

(Linux下如果用Python3,可能需要用pip3;如果遇到权限问题,加sudo)

步骤2:示例代码

import nmap

# 初始化扫描器
nm = nmap.PortScanner()

# 执行扫描:替换成你的目标IP/网段,arguments是Nmap命令参数(比如-sV探测服务版本)
try:
    nm.scan(hosts="192.168.1.0/24", arguments="-sV")

    # 遍历所有扫描到的主机
    for host_ip in nm.all_hosts():
        print(f"IP地址: {host_ip}")
        print(f"主机名: {nm[host_ip].hostname()}")
        print("开放端口详情:")
        
        # 遍历每个协议(TCP/UDP)
        for protocol in nm[host_ip].all_protocols():
            # 获取该协议下的所有端口
            ports = nm[host_ip][protocol].keys()
            for port in sorted(ports):
                port_state = nm[host_ip][protocol][port]["state"]
                if port_state == "open":
                    service = nm[host_ip][protocol][port]["name"]
                    print(f"  {port}/{protocol} | 状态: {port_state} | 服务: {service}")
        
        print("-" * 40)

except nmap.PortScannerError as e:
    print(f"Nmap调用出错:{str(e)}")
except Exception as e:
    print(f"程序出错:{str(e)}")

优势

  • 不需要手动生成和解析XML,一步完成扫描+结果提取
  • 返回的结果是字典结构,直接通过键值对就能获取所需信息
  • 支持所有Nmap命令参数,灵活度高

常见问题解决

  1. python-nmap导入失败

    • 确认已经正确安装:执行pip list | grep python-nmap,如果没输出就重新安装
    • 检查Python环境:确保运行脚本的Python版本和安装库的版本一致(比如用python3运行而不是python)
  2. 扫描无结果或权限不足

    • Linux下执行端口扫描需要root权限,运行脚本时加sudo(比如sudo python3 scan.py)
    • 确认目标主机在线,且Nmap命令参数正确(比如用-sn只探测存活主机,-p 1-1000指定端口范围)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:02:05