ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

jc 解析 `host` 命令输出:将 DNS 查询结果转为 JSON 的实用指南

jc 解析 `host` 命令输出:将 DNS 查询结果转为 JSON 的实用指南 开发工具【免费下载链接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.项目地址https://gitcode.com/gh_mirrors/jc/jc点击查看免费下载本指南聚焦 jc 项目中的host解析器docs/parsers/host.md讲解如何将 Linux/macOS 等系统上host命令的 DNS 查询输出A、AAAA、MX、TXT 记录及-C模式下的 SOA 记录转换为结构化的 JSON 数据从而直接交给 jq 等工具做进一步处理或融入自动化脚本。读完本文你将掌握jc --host与jc host两种 CLI 用法、jc.parse(host, ...)模块调用方式、两种输出 Schema 的字段含义以及该解析器在源码与测试中的实现细节。一、host解析器能做什么host是执行 DNS 查询的经典命令行工具。它的文本输出可读但不利于程序化处理A 记录、IPv6 地址、MX 记录等混杂在多行自由文本中且不同记录类型格式差异明显。jc 的host解析器专门针对host命令最常见的输出形态进行解析从源码注释jc/parsers/host.py可以看到其明确支持A 记录IPv4 地址AAAA 记录IPv6 地址MX 记录邮件交换服务器TXT 记录描述文本host -C模式输出的 SOA 记录Zone 权威信息解析器元数据jc/parsers/host.py声明了其兼容平台linux、darwin、cygwin、win32、aix、freebsd并登记了magic_commands [host]表示当命令行直接执行jc host ...时jc 会自动路由到本解析器。二、快速上手两种 CLI 用法文档给出的 CLI 用法docs/parsers/host.md有两种等价形式# 方式一管道传入 host google.com | jc --host # 方式二由 jc 直接调起 host 命令 jc host google.com方式一适合已持有host输出文本例如从远程主机采集、或需要先对原始命令做定制参数的场景方式二则由 jc 自动执行host并解析其结果省去中间环节适合快速体验。模块方式调用在 Python 中可以通过jc.parse直接传入host命令的文本输出import jc result jc.parse(host, host_command_output)其中host_command_output是host命令的 stdout 字符串。jc.parse会依据解析器名称host自动选择 jc/parsers/host.py 中的parse函数完成转换。三、默认输出 SchemaA/AAAA/MX/TXT 记录当host输出包含正向解析记录即未使用-C选项时解析结果是一个字典列表每个字典对应一个被查询的主机名Schema 如下docs/parsers/host.md[ { hostname: string, address: [string], v6-address: [string], mail: [string] } ]各字段含义字段类型说明hostnamestring被查询的主机名/域名addressstring 数组该主机名解析出的 IPv4 地址A 记录可多个v6-addressstring 数组该主机名解析出的 IPv6 地址AAAA 记录可多个mailstring 数组MX 记录对应的邮件服务器mail is handled by行的值此外从实现看jc/parsers/host.py若输出中包含descriptive text ...行TXT 记录解析结果还会追加text字段string 数组用于承载 TXT 描述文本。文档中的 Schema 未显式列出text字段但该字段已在源码中实现属于文档之外的扩展能力。典型输出示例文档给出的示例docs/parsers/host.md$ host google.com | jc --host [ { hostname: google.com, address: [ 142.251.39.110 ], v6-address: [ 2a00:1450:400e:811::200e ], mail: [ smtp.google.com. ] } ]仓库自带的测试夹具tests/fixtures/generic/host-google.out 与 tests/fixtures/generic/host-google.json验证了同一条解析链路google.com has address 142.250.179.206 google.com has IPv6 address 2a00:1450:400e:811::200e google.com mail is handled by 10 smtp.google.com.对应 JSON[{hostname:google.com,address:[142.250.179.206],v6-address:[2a00:1450:400e:811::200e],mail:[smtp.google.com.]}]可见同一主机名下的多条记录会被聚合进同一个字典条目中A 地址、IPv6 地址、MX 服务器各自进入数组字段这正是host输出转 JSON 后最直观的价值——每台主机一条结构化记录可直接按字段过滤。解析行格式的细节从源码jc/parsers/host.py可以看到默认模式按行匹配以下模式 has address 取第 0 个 token 为主机名、第 3 个 token 为 IPv4 地址追加到address数组 has IPv6 address 取第 0 个 token 为主机名、第 4 个 token 为 IPv6 地址追加到v6-address数组 mail is handled by 取第 0 个 token 为主机名、第 6 个 token 为 MX 服务器追加到mail数组 descriptive text 在引号处切分取引号内文本追加到text数组。也就是说同一主机名的多行输出会在循环中持续写入同一个rrdata字典直到解析结束统一追加到结果列表jc/parsers/host.py。这也解释了为何同一主机名可以聚合出多个address条目。四、SOA 记录模式-C选项与第二套 Schemahost -C zone会查询某 Zone 的 SOA 记录通常返回该 Zone 全部权威 Nameserver 的 SOA 信息。此时解析器切换到另一套 Schemadocs/parsers/host.md[ { nameserver: string, zone: string, mname: string, rname: string, serial: integer, refresh: integer, retry: integer, expire: integer, minimum: integer } ]字段含义字段类型说明nameserverstring返回 SOA 记录的权威 Nameserver 地址IPv4/IPv6zonestring被查询的 Zone 名称mnamestringZone 主 DNS 服务器Master NamernamestringZone 管理员的邮箱以 DNS 格式表示serialintegerSOA 序列号用于 Zone 版本/变更识别refreshinteger从服务器刷新主服务器数据的间隔秒retryinteger刷新失败后的重试间隔秒expireinteger从服务器放弃数据前的过期时间秒minimuminteger记录默认 TTL秒文档中的示例docs/parsers/host.md$ jc host -C sunet.se [ { nameserver: 2001:6b0:7::2, zone: sunet.se, mname: sunic.sunet.se., rname: hostmaster.sunet.se., serial: 2023090401, refresh: 28800, retry: 7200, expire: 604800, minimum: 300 }, { ... } ]注意文档示例展示的是原始字符串形态。根据_process的实现jc/parsers/host.pyserial、refresh、retry、expire、minimum五个字段会通过jc.utils.convert_to_int在最终输出中转换为整数因此实际输出中的这些字段是整数而非字符串非raw模式下。-C模式的特点在于每个 Nameserver 一行其后紧跟该 Nameserver 返回的 SOA 记录因此结果列表中每个元素对应一个 Nameserver 该服务器提供的 SOA 数据。仓库测试夹具tests/fixtures/generic/host-sunet.out提供了 8 个 Nameserver 的真实样例对应 JSONtests/fixtures/generic/host-sunet.json中可以看到serial、refresh等字段已是整数值[{nameserver:192.36.125.2,zone:sunet.se,mname:hidden-master.sunet.se.,rname:hostmaster.sunet.se.,serial:2023091102,refresh:28800,retry:7200,expire:604800,minimum:300}, ...]SOA 模式的解析细节从源码jc/parsers/host.py看SOA 模式的处理逻辑为遇到以Nameserver开头的行时进入 SOA 解析模式soaparse True并重置rrdata取行内第二个 token 作为nameserver去除末尾冒号遇到包含 has SOA record 的行时按空格切分依次提取zone、mname、rname、serial、refresh、retry、expire、minimum组装完成后立即追加进raw_output每对 Nameserver/SOA 单独成为一个列表元素。如果 SOA 行格式不符合预期token 不足会通过jc.utils.warning_message输出Unknown format detected.警告jc/parsers/host.py且每条警告只提示一次warned标志去重。五、parse函数签名与参数语义文档给出了模块入口的函数签名docs/parsers/host.mddef parse(data: str, raw: bool False, quiet: bool False)参数类型默认值说明datastr无待解析的host命令文本输出rawboolFalse为True时返回未经类型转换的原始结构化数据即保留字符串形态不做整型转换quietboolFalse为True时抑制兼容性检查等警告信息返回值字典列表即raw 或 processed 的结构化数据docs/parsers/host.md。函数内部的执行顺序jc/parsers/host.pyjc.utils.compatibility(__name__, info.compatible, quiet)做平台兼容性检查jc.utils.input_type_check(data)校验输入为字符串jc.utils.has_data(data)空输入直接返回[]逐行解析并组装raw_outputrawTrue时原样返回raw_output否则交由_process做最终类型规整。从测试用例tests/test_host.py可以看到空输入host无参数时仅输出帮助信息、无实际记录可解析返回空列表[]这一行为已被单元测试锁定。六、与 jq 结合把 DNS 数据变成可编程资产解析成 JSON 后host的输出可以无缝接入 jq 等工具链。例如查看某域名解析出的所有 IPv4 地址host google.com | jc --host | jq .[0].address[]批量提取多个域名记录的 MX 服务器for d in example.com example.org; do host $d | jc --host done | jq -r .[].mail[]对于-C模式可以方便地横向对比所有权威 Nameserver 返回的 SOA 序列号是否一致发现不一致往往是 Zone 未完全同步的信号jc host -C sunet.se | jq [.[].serial] | unique | length若输出为1说明所有 Nameserver 的 SOA 序列号一致。这类先结构化、再过滤/聚合的用法正是 jc 项目将命令行输出转换为 JSON/YAML/字典的核心价值所在。七、结合源码理解实现边界从源码结构可以确认该解析器的几个实现特征逐行字符串匹配而非正则默认模式与 SOA 模式均通过in/startswith子串判断加split切分完成实现轻量、依赖少适合host输出的固定句式jc/parsers/host.py。按输出句式区分模式是否出现Nameserver行决定了是否进入 SOA 模式若从未出现则按默认记录模式聚合输出soaparse标志控制jc/parsers/host.py。类型规整集中在_process仅 SOA 字段做convert_to_intA/AAAA/MX/TXT 字段保持字符串符合 Schema 定义jc/parsers/host.py。测试覆盖tests/test_host.py 通过host-google.out与host-sunet.out两组夹具分别验证默认模式与 SOA 模式的解析结果且测试注释明确说明host 无输入时只显示帮助信息这一现实限制因此测试以空输入返回[]作为无数据用例。八、总结jc --host/jc host将 DNS 查询工具host的文本输出转换为结构化 JSON覆盖 A、AAAA、MX、TXT 四种最常见记录及-C模式下的完整 SOA 信息同一主机名多记录自动聚合、SOA 时间字段自动转整型使其天然适合与 jq 组合用于 DNS 监控、Zone 一致性校验和自动化运维脚本。对更深入的实现细节可直接阅读解析器源码 jc/parsers/host.py 与测试夹具 tests/fixtures/generic/host-google.out、tests/fixtures/generic/host-sunet.out。赞分享开发工具【免费下载链接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.项目地址https://gitcode.com/gh_mirrors/jc/jc点击查看免费下载相关推荐jc 解析器实战指南用 jc --history 将 shell history 命令输出转换为 JSONjc 解析器实战指南用 jc history 将 shell history 命令输出转换为 JSON 本指南以 jc 开源项目中的 history 解析器文开发工具jc 的 file 命令解析器将 file * 输出转换为结构化 JSONjc 的 file 命令解析器将 file 输出转换为结构化 JSON 导读 file 命令是 Linux / macOS 系统上最常用的文件类型探测工具但开发工具jc 解析器实战将 id 命令输出转换为结构化 JSON 的完整指南jc 解析器实战将 id 命令输出转换为结构化 JSON 的完整指南 id 命令是 Linux/macOS 系统上查看当前用户身份信息UID、GID、所属组开发工具上一篇Pusher-js 事件系统完整指南从绑定到触发的全流程最佳实践下一篇从混乱到有序ESP-IDF 5.0 系统组件迁移实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表