基于Python开发的跨平台Nmap自动化扫描工具
本文详细介绍如何使用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自动化扫描工具的详细内容,更多关于网络安全自动化扫描的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









