ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

如何生成 theHarvester JSONL 报告并用 jq 提取各类型扫描结果

2026/9/14 22:23:55 拓冰建站 浏览量
如何生成 theHarvester JSONL 报告并用 jq 提取各类型扫描结果 如何生成 theHarvester JSONL 报告并用 jq 提取各类型扫描结果【免费下载链接】theHarvesterE-mails, subdomains and names Harvester - OSINT项目地址: https://gitcode.com/GitHub_Trending/th/theHarvester当你要用 theHarvester 对一个授权域名做被动收集并把结果交给脚本或其他工具时终端输出并不适合作为自动化接口——文档推荐的自动化输出是-f参数写出的 JSONL 报告。这篇文章基于 README.md、Results-and-Local-Data.md 和 Quick-Start.md完成两件事用一条命令生成report.jsonl再用jq从中提取 hostname、IP、ASN、邮箱、URL、person、breach 等各类型结果。环境前提theHarvester 要求 Python 3.14仓库的.python-version会让uv自动选择。下面的命令在源码检出目录中通过uv运行如果你用的是 Kali 等已安装的发行版包去掉uv run前缀即可。只对你拥有或明确获得测试许可的目标运行示例中的example.com是 IANA 保留演示域实际使用时替换为授权范围内的目标。生成 JSONL 报告-f NAME指定报告文件名。以两个无需 API key 的被动证书源为例uv run theHarvester -d example.com -b crtsh,certspotter -f report该命令同时写出三个文件report.jsonl自动化与单次运行交换的主格式每行一条记录report.json与report.xml面向既有集成JSON、XML的兼容性报告。它们按结果类型分组但不记录每条结果来自哪个源所以做来源归因时必须用 JSONL。JSONL 文件结构第一行是运行摘要记录type:summary包含run_id、target、counts、evidence_status以及每个源的source_executions结果之后每一行是一条已排序、去重的 finding携带自身的sources来源源与actions来源动作溯源。counts对象汇总其后的结果行数。下面是文档示例README.md 原文值均为文档用例不是你必须复现的固定结果{action_executions:[],artifacts:[],completed_at:2026-08-17T12:01:00Z,counts:{asn:1,breach:1,email:1,hostname:1,ip:1,url:1},evidence_status:complete,result_count:6,run_id:123e4567-e89b-12d3-a456-426614174000,source_executions:[{duration_ms:127.4,error_type:null,result_count:1,source:haveibeenpwned,status:completed,stop_reason:null},{duration_ms:482.3,error_type:null,result_count:5,source:zoomeye,status:completed,stop_reason:null}],started_at:2026-08-17T12:00:00Z,target:example.com,type:summary} {sources:[zoomeye],type:asn,value:AS64500} {sources:[haveibeenpwned],type:breach,value:Example breach} {sources:[zoomeye],type:email,value:securityexample.com} {sources:[zoomeye],type:hostname,value:api.example.com} {sources:[zoomeye],type:ip,value:192.0.2.10} {sources:[zoomeye],type:url,value:https://api.example.com/login}用 jq 提取各类型结果结果记录的基础类型是hostname、ip、asn、email、url、person、breach。提取单一类型用select(.type ...) | .value-r让输出为裸字符串jq -r select(.type hostname) | .value report.jsonl jq -r select(.type ip) | .value report.jsonl jq -r select(.type asn) | .value report.jsonl jq -r select(.type email) | .value report.jsonl jq -r select(.type url) | .value report.jsonl jq -r select(.type breach) | .value report.jsonl两个要注意的点person记录的value是一个 JSON 字符串需要再走一步fromjson才能得到结构化数据jq -c select(.type person) | .value | fromjson report.jsonl-b subdomains这类能力选择器产生的是hostname记录因为结果可能就是目标 hostname 本身不一定是子域。能力选择器subdomains、emails、ips、asns、urls、people、breaches构成一个并集只用于挑选运行哪些源不会丢弃这些源返回的其他结果类型。示例里的crtsh和certspotter按源矩阵都只返回 subdomains所以想让报告里出现email、breach等行需要按 README 源矩阵选能返回这些类型的源或混用能力选择器与显式源名例如 README 中的工作流示例uv run theHarvester -d example.com -b emails,urls,certspotter。读取结构化证据记录部分记录带有结构化证据读法不同# 递归 DNS 的结构化记录value 是 JSON 字符串需 fromjson jq -c select(.type dns-recursive-finding) | .value | fromjson report.jsonl # Shodan 主机富化IP 是 value服务详情在 details jq -c select(.type shodan-host) | {ip: .value, services: .details.services} report.jsonl # 携带 observations 的 hostname / ASN 记录 jq -c select(.type hostname and .observations) | {hostname: .value, observations} report.jsonl jq -c select(.type asn and .observations) | {asn: .value, observations} report.jsonl文档给出的读法规则person、infostealer和递归 DNS 的 value 包含 JSON 字符串需要第二次fromjsonShodan 主机用details承载服务详情虚拟主机、网络前缀prefix和 ASN 归属使用原生observationstakeover 结果把 hostname 留在valueDNS、wildcard、HTTP、规则、状态和错误证据放在details。这些记录只会在相应动作实际运行时出现在报告中——被动源是 P0DNS 解析、暴力破解、递归 DNS、反向解析是 P1HTTP、TLS、截图、takeover、虚拟主机、端口和端点动作是 P2P1 和 P2 活动只有在你显式选择时才会运行。全量列出与格式转换要按 type/value 两列制表符分隔导出全部结果或保留溯源字段输出紧凑 JSON 对象# 全部 findings 作为 type、value 的制表符分隔列 jq -r select(.type ! summary) | [.type, .value] | tsv report.jsonl # 带溯源的紧凑 JSON 对象 jq -c select(.type ! summary) | {type, value, sources, actions} report.jsonl摘要行没有value字段所以凡是面向结果记录的提取都要用精确类型匹配或select(.type ! summary)排除掉它。验证报告与结果是否完整核对方式落在摘要行上evidence_status与各源source_executions中的status、stop_reason用来区分“正常的空结果”和“不完整或失败的工作”——空结果可能只是提供方没查到东西本身不能证明运行失败。如果某个源在保留部分结果后被提供方配额或安全限制中断运行会保留这些结果并把该源标记为 partial 并记录停止原因。counts对象汇总其后的结果行数可以拿它与按类型提取的记录数逐一对比。文档示例中counts每种类型各为 1共 6 行结果记录可作为对照格式参照。限制与注意事项各提供方控制自己的可用性、配额与响应格式单个源可能独立于 theHarvester 发生变化某源没有产出时先看摘要行的source_executions再下结论。默认存在共享的单源结果上限和本地页数上限需要移除时传--limit 0各适配器会运行到提供方耗尽为止。OSINT 结果可能包含敏感数据报告文件、截图和运行记录所在的~/.local/share/theHarvester/stash.sqlite数据库不要提交进源码仓库只在授权任务范围内分享分享问题时只给出复现所需的最小脱敏输出。JSONL 完整字段与证据契约见 Results-and-Local-Data.md59 个发现源各自返回的结果类型见 README.md 的源矩阵。【免费下载链接】theHarvesterE-mails, subdomains and names Harvester - OSINT项目地址: https://gitcode.com/GitHub_Trending/th/theHarvester创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考