ARTICLE DETAIL

资讯详情

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

jc 解析器实战:用 airport_s 将 macOS `airport -s` 扫描结果转换为 JSON

jc 解析器实战:用 airport_s 将 macOS `airport -s` 扫描结果转换为 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点击查看免费下载airport_s是 jcJSON Convert内置的命令解析器之一专门用于把 macOS 系统自带airport -s命令输出的 Wi-Fi 扫描表格转换为结构化的 JSON 数组。本文将以 docs/parsers/airport_s.md 为骨架结合解析器源码与测试用例完整讲解其 CLI / 模块调用方式、JSON Schema、raw 原始模式与 processed 处理模式的差异以及底层表格解析原理读完即可在自己的 macOS 自动化脚本中直接使用。airport_s 解析器是什么在 macOS 上airport -sscan命令会列出当前环境扫描到的所有 Wi-Fi 网络输出一个固定格式的文本表格包含 SSID、BSSID、信号强度RSSI、信道、HT 模式、国家代码以及安全认证方式等信息。airport_s解析器版本 1.6作者 Kelly Brazil将该表格逐行解析为 JSON 数组使结果可以直接管道给jq、写入数据库或用于无线网络监测脚本。该解析器对应的底层程序位于 macOS 系统私有框架中完整路径为/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport在 jc/parsers/airport_s.py 中解析器的元数据声明了其适用范围与触发命令class info(): version 1.6 description airport -s command parser author Kelly Brazil author_email kellyjonbrazilgmail.com compatible [darwin] magic_commands [airport -s] tags [command]其中compatible [darwin]表明该解析器仅适用于 macOSDarwin平台在其他操作系统上运行 jc 会输出兼容性警告magic_commands [airport -s]则是 jc CLI 自动识别命令并匹配解析器的依据。解析器在 jc/lib.py 的解析器注册表中以airport-s为键名登记。快速上手两种 CLI 调用方式原文档给出了两种等价的命令行用法$ airport -s | jc --airport-s或利用 jc 的魔术命令magic command语法直接调用$ jc airport -s第一种方式把airport -s的原始输出通过管道交给 jc并显式指定--airport-s解析器第二种方式由 jc 根据参数自动推导出要执行的系统命令与对应解析器。二者产出的 JSON 结构完全一致。模块调用方式除了 CLIairport_s也可以作为 Python 模块直接使用import jc result jc.parse(airport_s, airport_s_command_output)jc.parse()接收解析器名称此处为airport_s和命令输出的原始文本字符串返回解析后的结构化数据List of Dictionaries。输出 JSON Schemaprocessed默认模式下解析器输出的 JSON Schema 如下[ { ssid: string, bssid: string, rssi: integer, channel: string, ht: boolean, cc: string, security: [ string ] } ]各字段含义与类型说明字段类型含义ssidstring无线网络名称可能包含空格bssidstring接入点的 MAC 地址形如00:67:eb:2a:a7:3brssiinteger接收信号强度指示负值数值越大信号越强如-90channelstring信道号可能是6、11、36也可能出现3,1这类多信道表示htboolean是否启用 802.11n 高吞吐模式High Throughputccstring国家/地区代码Country Code--表示未报告securitystring 数组安全认证方式列表如WPA2(PSK/AES/AES)、NONE值得注意的细节security是数组因为一个热点可能同时广播多种安全协议例如WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP)会被拆分为两个独立元素。完整示例processed 模式与 raw 模式对比原文档给出了两种输出示例下面结合真实 fixture 数据完整展示。processed 模式默认$ airport -s | jc --airport-s -p [ { ssid: DIRECT-4A-HP OfficeJet 3830, bssid: 00:67:eb:2a:a7:3b, rssi: -90, channel: 6, ht: true, cc: --, security: [ WPA2(PSK/AES/AES) ] }, { ssid: Latitude38, bssid: c0:ff:d5:d2:7a:f3, rssi: -85, channel: 11, ht: true, cc: US, security: [ WPA2(PSK/AES/AES) ] }, { ssid: xfinitywifi, bssid: 6e:e3:0e:b8:45:99, rssi: -83, channel: 11, ht: true, cc: US, security: [ NONE ] }, ... ]raw 模式-r$ airport -s | jc --airport-s -p -r [ { ssid: DIRECT-F3-HP ENVY 5660 series, bssid: b0:5a:da:6f:0a:d4, rssi: -93, channel: 1, ht: Y, cc: --, security: WPA2(PSK/AES/AES) }, { ssid: YouAreInfected-5, bssid: 5c:e3:0e:c2:85:da, rssi: -85, channel: 36, ht: Y, cc: US, security: WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP) }, ... ]对比可见两种模式的差异raw 模式保留文本原貌rssi是字符串-93ht是字符Ysecurity是一个整体字符串多个协议之间用空格分隔。processed 模式做了类型转换与结构重组rssi变成整数ht变成布尔值truesecurity按空格拆分为字符串数组。parse() 函数签名与参数解析器的核心入口是parse()函数完整签名如下def parse(data, rawFalse, quietFalse)参数类型默认值说明datastring必填待解析的airport -s命令输出文本rawbooleanFalse为True时返回未经类型转换的原始结构化数据quietbooleanFalse为True时抑制兼容性等警告消息返回值List of Dictionaries即 raw 或 processed 两种形态之一的结构化数据。源码级解析流程三步完成表格转换在 jc/parsers/airport_s.py 中parse()的实现逻辑分为三步第一步前置检查与数据清洗jc.utils.compatibility(__name__, info.compatible, quiet) jc.utils.input_type_check(data) raw_output [] cleandata list(filter(None, data.splitlines()))先调用jc.utils.compatibility()校验当前平台是否在[darwin]兼容列表中不兼容时输出警告除非quietTrue再用jc.utils.input_type_check()校验输入类型随后把输入按行拆分并过滤掉空行为表格解析做准备。第二步表头归一化# fix headers cleandata[0] cleandata[0].lower() cleandata[0] cleandata[0].replace(-, _) cleandata[0] cleandata[0].replace(security (auth/unicast/group), security)airport -s的表头是SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)这里执行三项归一化表头全部转为小写SSID→ssid连字符替换为下划线SECURITY (auth/unicast/group)本身无连字符此规则是为了兼容其他命令表头风格把冗长的security (auth/unicast/group)列名精简为security与最终 Schema 对齐。第三步调用通用稀疏表格解析器raw_output jc.parsers.universal.sparse_table_parse(cleandata)随后交给 jc/parsers/universal.py 中的sparse_table_parse()完成真正的表格解析。这是一个通用表格解析器专门处理两类棘手情况列数据缺失某些行没有CC或HT值列数据内含空格例如 SSIDDIRECT-4A-HP OfficeJet 3830以及多协议并存的security字段。其核心思路是先找到最长行把所有行用空格补齐到等宽再依据表头各列名的起始位置定位每一列的边界解析时从右往左为每列边界插入不可见分隔符\u2063该字符几乎不可能出现在终端输出中避免与数据冲突最后按分隔符切分并strip()清理空白空单元格统一转换为None。这保证了无论 SSID 含多少个空格都能被准确归入ssid列而非错误拆散。类型转换与 security 拆分_process() 内部机制processed 模式下的全部转换集中在_process()函数jc/parsers/airport_s.pydef _process(proc_data): for entry in proc_data: # convert integers and booleans int_list {rssi} bool_list {ht} for key in entry: if key in int_list: entry[key] jc.utils.convert_to_int(entry[key]) if key in bool_list: entry[key] jc.utils.convert_to_bool(entry[key]) if security in entry: entry[security] entry[security].split() return proc_datarssi通过jc.utils.convert_to_int()转为整数ht通过jc.utils.convert_to_bool()把Y/N转为True/Falsesecurity字段若存在则用split()按空白拆分为字符串数组这就是为什么 raw 输出中的WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP)会变成两个数组元素。注意parse()中raw参数的作用点rawTrue时直接返回sparse_table_parse的原始结果跳过_processrawFalse时返回处理后的结果。测试与真实 fixture 验证解析器的行为由单元测试覆盖见 tests/test_airport_s.py核心断言是def test_airport_s_nodata(self): Test airport -s with no data self.assertEqual(jc.parsers.airport_s.parse(, quietTrue), []) def test_airport_s_osx_10_14_6(self): Test airport -s on OSX 10.14.6 self.assertEqual( jc.parsers.airport_s.parse(self.osx_10_14_6_airport_s, quietTrue), self.osx_10_14_6_airport_s_json )空输入测试parse(, quietTrue)返回[]说明无数据时解析器安全退化为空数组真实输出测试以 macOS 10.14.6 上的真实airport -s输出 tests/fixtures/osx-10.14.6/airport-s.out 为输入断言与期望 JSON tests/fixtures/osx-10.14.6/airport-s.json 完全一致。从 fixture 中可以观察到airport -s输出的几个典型特征也正好验证了解析器设计上的针对性SSID 长度不一且含空格如DIRECT-4A-HP OfficeJet 3830普通按空格切分的方式必然出错同一 BSSID 的不同频段会以多行出现channel字段可能出现3,1表示信道 3 及扩展信道 1这类复合值security列既有NONE也有WPA2(PSK/AES/AES)单协议还有WPA(PSK/AES,TKIP/TKIP) WPA2(PSK/AES,TKIP/TKIP)多协议并存的情况。与其他 airport 解析器的区别仓库中还存在同系列的 airport 解析器源码见 jc/parsers/airport.py二者很容易混淆区别在于解析器对应命令输出形态核心字段airport_sairport -s扫描周边网络JSON数组每条一个可见热点ssid、bssid、rssi、channel、ht、cc、securityairportairport -I查询当前连接信息JSON对象描述当前关联的网络agrctlrssi、state、op_mode、lasttxrate、link_auth、802_11_auth等选型建议需要列举周边全部热点做信号扫描、信道规划或安全审计时用--airport-s需要获取当前网卡连接状态、速率与认证详情时用--airport。典型实战场景将airport_s接入自动化脚本可以快速实现如下能力信号质量巡检定时执行airport -s | jc --airport-s用jq按rssi排序找出最强/最弱热点安全审计筛选security数组包含NONE的开放网络定位未加密热点信道规划统计channel分布评估 2.4GHz信道 1–11与 5GHz信道 36的拥挤程度Python 集成在脚本中调用jc.parse(airport_s, output)直接把文本表格转成字典列表入库。小结airport_s解析器把 macOSairport -s的文本扫描表转换为结构清晰的 JSON其核心价值在于解决了两个文本解析难点——含空格的 SSID 列定位与多协议 security 字段拆分。通过-r原始模式可保留文本原貌processed 模式则提供规范化的类型与结构配合jc -p参数还能输出带缩进的可读 JSON方便直接观察与调试。相关的完整文档、源码与测试样例分别位于 docs/parsers/airport_s.md、jc/parsers/airport_s.py、jc/parsers/universal.py 与 tests/test_airport_s.py可进一步深入研读。赞分享开发工具【免费下载链接】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 将 /etc/gshadow 组影子文件转换为 JSONjc 解析器实战用 jc 将 /etc/gshadow 组影子文件转换为 JSON 本篇技术指南聚焦 jcJSON Convert项目中的 gshadow开发工具jc 解析器实战使用 jc --gpg 将 gpg --with-colons 输出转换为 JSONjc 解析器实战使用 jc gpg 将 gpg with colons 输出转换为 JSON 导读 本文介绍 jcJSON Convert项目中的 gpg开发工具使用 jc 将 macOS airport -I 命令输出解析为 JSON完整指南使用 jc 将 macOS airport I 命令输出解析为 JSON完整指南 macOS 自带的 airport I 命令可一次性输出当前 Wi Fi 连开发工具上一篇OpenDesign 设计系统 2.0 的 Token 契约与溯源机制以 Supabase 包 source/evidence.md 为例下一篇VuePack实战指南7大核心问题解决方案与最佳实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表