本文目录导读:

当然可以!批量扫描是网络管理和安全测试中的常见需求,我必须先强调:请只在获得明确授权的网络和系统上使用扫描工具,未经授权的扫描是非法和不道德的行为。
根据你的具体需求(如扫描端口、检测服务、发现存活主机或寻找漏洞),有几种不同的实用脚本和工具可以实现批量扫描,以下是一些常见的方法和示例脚本:
使用 nmap 进行批量扫描(最强大、最常用)
nmap 本身就支持通过多种方式批量处理目标,结合简单的 shell 脚本可以非常灵活。
核心方法: 将 IP 地址或网段列表放入一个文本文件,然后用 -iL 参数导入。
示例脚本 (batch_nmap_scan.sh):
#!/bin/bash
# 定义输入文件(每行一个IP、网段或主机名)
INPUT_FILE="targets.txt"
# 定义输出目录
OUTPUT_DIR="nmap_results"
# 定义扫描选项(-sS 半开扫描,-sV 版本检测,-O 系统检测)
SCAN_OPTIONS="-sS -sV -O -T4"
# 创建输出目录
mkdir -p "$OUTPUT_DIR"
# 检查输入文件是否存在
if [ ! -f "$INPUT_FILE" ]; then
echo "错误:输入文件 $INPUT_FILE 不存在!"
exit 1
fi
# 逐行读取目标并执行扫描
while IFS= read -r target; do
# 跳过空行和注释行(以#开头)
if [[ -z "$target" || "$target" == \#* ]]; then
continue
fi
# 生成安全的文件名(替换斜杠和冒号等特殊字符)
safe_name=$(echo "$target" | sed 's/[\/:]/_/g')
output_file="${OUTPUT_DIR}/${safe_name}_scan.xml"
echo "正在扫描: $target"
# 执行 nmap 扫描,输出为 XML 格式(方便自动化解析)
nmap $SCAN_OPTIONS -oX "$output_file" "$target"
# 可选:同时输出为文本格式供快速查看
# nmap $SCAN_OPTIONS -oN "${OUTPUT_DIR}/${safe_name}_scan.txt" "$target"
echo "扫描完成: $target -> $output_file"
echo "------------------------"
done < "$INPUT_FILE"
echo "所有批量扫描任务完成!结果保存在 $OUTPUT_DIR 目录。"
targets.txt 文件示例:
# 这是注释行
192.168.1.1
192.168.1.0/24
scanme.nmap.org
10.0.0.1-10.0.0.100
针对特定服务的批量检测脚本
如果你只想快速检查某个端口是否开放(SSH 22端口),可以使用更轻量的工具。
使用 nc (netcat) 批量检测端口:
#!/bin/bash
# 批量检测多个主机的特定端口是否开放
TARGETS="192.168.1.1 192.168.1.2 192.168.1.3"
PORT=22
for ip in $TARGETS; do
# -z 表示零I/O模式扫描,-w 2 设置超时2秒
nc -z -w 2 $ip $PORT &>/dev/null
if [ $? -eq 0 ]; then
echo "$ip:$PORT 开放"
else
echo "$ip:$PORT 关闭或不可达"
fi
done
使用 masscan (极速端口扫描)
masscan 是异步的端口扫描器,速度极快,适合扫描大规模 IP 段。
# 扫描整个 B 类网段(10.0.0.0/16)的80和443端口,速率10万包/秒 masscan 10.0.0.0/16 -p80,443 --rate=100000 -oJ masscan_results.json # 从文件读取目标列表批量扫描 masscan -iL targets.txt -p1-65535 --rate=50000 -oG masscan_results.gnmap
高级:使用 Python 脚本实现灵活的批量扫描
Python 的 python-nmap 库可以让你编写更复杂的扫描逻辑。
Python 批量扫描脚本示例:
#!/usr/bin/env python3
import nmap
import json
import sys
def batch_scan(target_file, output_file):
nm = nmap.PortScanner()
results = {}
try:
with open(target_file, 'r') as f:
targets = [line.strip() for line in f if line.strip()]
except FileNotFoundError:
print(f"错误:文件 {target_file} 未找到")
sys.exit(1)
for target in targets:
print(f"正在扫描: {target}")
try:
# 设置扫描参数,-sV 版本检测,--script vulners 漏洞检测(需要安装相应脚本)
nm.scan(target, arguments='-sV -T4')
results[target] = nm[target]
except Exception as e:
print(f"扫描 {target} 时出错: {e}")
results[target] = {"error": str(e)}
# 保存结果为 JSON 格式
with open(output_file, 'w') as f:
json.dump(results, f, indent=2)
print(f"批量扫描完成,结果已保存到 {output_file}")
if __name__ == "__main__":
# 使用方法:python script.py targets.txt results.json
if len(sys.argv) != 3:
print("用法: python batch_scan.py <目标文件> <输出文件>")
sys.exit(1)
batch_scan(sys.argv[1], sys.argv[2])
注意事项和安全考量
- 授权至关重要:在开始扫描前,务必获得网络所有者的书面授权,即使是自己的网络,也要注意不要干扰正常业务。
- 扫描速度:设置合理的扫描速率(
-T参数或--rate),过快的扫描可能被误判为 DDoS 攻击或导致网络设备过载。 - 法律风险:许多国家和地区的法律规定,未经授权的网络扫描属于违法行为。
- 结果处理:批量扫描会产生大量数据,建议使用结构化的输出格式(XML、JSON)并配合解析工具。
- 注意事项:某些 IDS/IPS 系统可能检测到扫描行为并触发警报。
推荐实践流程
- 先小规模测试(1-2 个 IP),确认扫描参数正确。
- 使用
--reason参数查看端口状态原因,帮助分析结果。 - 对于扫描结果,使用
grep、awk或专门的 NSE 脚本进行二次分析。 - 考虑使用
dmitry、recon-ng等更专业的侦察框架。
如果你能提供更具体的需求(是扫描内网所有存活主机?还是检测特定漏洞?),我可以为你提供更精准的脚本建议。能力越大,责任越大。