尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

jc 解析 /proc/net/packet:将 Linux Packet 套接字表转换为结构化 JSON

发布时间:2026/9/26 7:38:53

资讯中心
01
ARTICLE

jc 解析 /proc/net/packet:将 Linux Packet 套接字表转换为结构化 JSON

jc 解析 /proc/net/packet:将 Linux Packet 套接字表转换为结构化 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点击查看免费下载导读/proc/net/packet是 Linux 内核导出的文本文件记录了系统中所有已注册的 AF_PACKETpacket socket套接字信息包含 socket 内核句柄、引用计数、协议类型、关联网卡、收发队列占用及所属进程等字段。本文围绕 jc 项目中该文件对应的专用解析器 proc_net_packet.py完整讲解其命令行与模块两种调用方式、JSON 输出 Schema、raw 原始模式与处理模式的差异并结合源码与测试用例剖析其基于通用简单表格解析器的底层实现原理。读完本文你将能够在 Linux 环境下把/proc/net/packet的输出一键转换为可供 jq 等工具消费的结构化数据并理解 jc 中 proc 类解析器的自动识别机制。一、/proc/net/packet 是什么/proc/net/packet由内核 packet socket 子系统维护每一行描述一个已打开的 AF_PACKET 套接字。其典型内容对应仓库测试夹具 net_packet如下sk RefCnt Type Proto Iface R Rmem User Inode ffff9b61b56c1800 3 3 88cc 2 1 0 101 34754各列含义如下列名含义skpacket socket 的内核 socket 结构体地址十六进制sk_buff/sock对象指针RefCnt该套接字的引用计数即当前引用该 socket 的内核对象数量Type套接字类型3对应SOCK_RAW原始套接字2对应SOCK_DGRAMProto绑定的以太网协议号十六进制如88cc为 LLDP 协议Iface绑定接口的索引号ifindex0表示未绑定特定接口R内核守护进程是否运行1/0 标志位Rmem当前接收队列占用的内存字节数User打开该套接字的进程的用户 IDuidInode该套接字对应的 inode 号可用于与/proc/*/fd关联这段内容来自 Linux 内核的 packet 套接字实现net/packet/af_packet.c其中sk地址可用于对比ss -uap、ss -i等工具输出中的 socket 标识Proto与Iface则直接反映链路层抓包/收包程序的绑定关系。注意该文件通常仅显示一行表头加若干数据行多数发行版在无 packet socket 时该文件仍会存在但可能为空或仅有表头这与 jc 解析器对无数据输入的处理逻辑见下文直接相关。二、两种调用方式与 jc 的所有解析器一致proc_net_packet支持 CLI 与 Python 模块两种使用方式。2.1 CLI 方式三种等价写法对应 proc_net_packet.py 文档字符串# 方式一通过通用 proc 解析器自动识别 $ cat /proc/net/packet | jc --proc # 方式二直接传入文件路径jc 会读取并按文件类型自动分发 $ jc /proc/net/packet # 方式三指定专用解析器 $ cat /proc/net/packet | jc --proc-net-packet--proc与--proc-net-packet的区别在于前者是 proc.py 这个总入口解析器它通过一组正则签名逐一匹配/proc下各文件的表头特征后自动分派到对应的子解析器后者则直接指定本文件对应的专用解析器跳过签名匹配阶段。由于 proc_net_packet.py 中info.hidden True该解析器属于隐藏解析器不会出现在常规的jc -l列表中但可通过jc -hh查看也仍然可以通过--proc-net-packet显式调用。2.2 Python 模块方式import jc # 方式一读取文件内容后交给通用 proc 解析器 with open(/proc/net/packet, encodingutf-8) as f: proc_net_packet_file f.read() result jc.parse(proc, proc_net_packet_file) # 方式二直接调用专用解析器名 result jc.parse(proc_net_packet, proc_net_packet_file)jc.parse()是 lib.py 提供的高层 API第一个参数可以是解析器模块名字符串或模块对象内部会查找对应解析器并调用其parse()方法。两种方式得到的结构化结果完全一致。三、输出 Schema 与类型约定解析结果是一个单元素字典因为/proc/net/packet在测试夹具中只有一行数据输出 Schema 如下取自文档与模块 docstring{ sk: string, RefCnt: integer, Type: integer, Proto: string, Iface: integer, R: integer, Rmem: integer, User: integer, Inode: integer }类型约定要点字符串字段sk十六进制 socket 地址与Proto十六进制协议号保持原始字符串形式不做进制转换整数字段其余 7 个字段RefCnt、Type、Iface、R、Rmem、User、Inode在默认处理模式下会被转换为 Pythonint该解析器在单行数据时返回字典而非列表若未来内核输出多行则需要结合 universal.py 中simple_table_parse的行为确认当前解析器实现只取第一行数据见下文源码分析。四、输出示例处理模式与 raw 原始模式4.1 默认处理模式-p 美化输出$ cat /proc/net/packet | jc --proc -p { sk: ffff9b61b56c1800, RefCnt: 3, Type: 3, Proto: 88cc, Iface: 2, R: 1, Rmem: 0, User: 101, Inode: 34754 }此模式下整数字段已转换为数值类型可直接参与 jq 的数值运算与比较。4.2 raw 原始模式-r 保留字符串$ cat /proc/net/packet | jc --proc-net-packet -p -r { sk: ffff9b61b56c1800, RefCnt: 3, Type: 3, Proto: 88cc, Iface: 2, R: 1, Rmem: 0, User: 101, Inode: 34754 }-r模式下所有字段含RefCnt、Type等均保留为字符串与文件中的原始文本一一对应适合需要保留原样进行后续文本处理或自做类型转换的场景。将两种模式组合使用即可实现解析 查询的完整链路例如$ cat /proc/net/packet | jc --proc | jq .[0].Proto 88cc五、parse() 函数签名与参数说明解析器对外暴露的唯一入口函数定义如下见 proc_net_packet.pydef parse( data: str, raw: bool False, quiet: bool False ) - Dict:参数类型默认值说明datastr必填待解析的文本数据/proc/net/packet文件内容rawboolFalse为True时返回未经类型转换的原始字符串输出quietboolFalse为True时抑制兼容性警告等提示信息写入 STDERR返回值为字典Dictraw 或处理后的结构化数据。5.1 兼容性检查parse()首先调用jc.utils.compatibility(__name__, info.compatible, quiet)见 utils.py。解析器元数据中compatible [linux]proc_net_packet.py因此在 Linux 上运行时不产生任何提示在 macOS、Windows 等非 Linux 平台运行时会向 STDERR 输出警告提示该文件解析器仅支持 Linux 平台输出可用-q/quietTrue抑制该警告只是提示不会阻断解析——适用于在非 Linux 机器上处理从 Linux 采集来的文件的场景。5.2 输入类型检查与空数据保护随后调用jc.utils.input_type_check(data)校验输入类型再通过jc.utils.has_data(data)utils.py判断输入是否为空或全空白如果data为空字符串或仅含空白字符则直接返回空字典{}不会进入表格解析流程。这一行为在测试用例 test_proc_net_packet.py 中有明确覆盖def test_proc_net_packet_nodata(self): self.assertEqual(jc.parsers.proc_net_packet.parse(, quietTrue), {})六、源码级实现原理6.1 依赖通用简单表格解析器proc_net_packet.py 的核心解析逻辑非常精简只有几行raw_output: Dict {} if jc.utils.has_data(data): raw_output_list simple_table_parse(data.splitlines()) raw_output raw_output_list[0] return raw_output if raw else _process(raw_output)它复用了 jc 的通用解析器 universal.py 中的simple_table_parse()将输入按行拆分data.splitlines()第 0 行必须是表头表头行按空白切分得到列名sk、RefCnt、Type、Proto、Iface、R、Rmem、User、Inode后续数据行按前 N-1 个字段用空白切分、最后一列保留空格的方式切分与每个表头配对成字典返回字典列表。simple_table_parse的适用前提是表格中没有空白单元格这与/proc/net/packet每列都有值的格式正好匹配同时函数要求调用方将表头中的空格替换为下划线并转为小写而/proc/net/packet的表头本身就没有空格且首字母大写jc 通过_process阶段保留了表头原始大小写作为 JSON 键名RefCnt、Rmem、Inode等均为驼峰式。6.2 类型转换发生在 _process 阶段proc_net_packet.py 中的_process()是唯一涉及类型转换的逻辑int_list {RefCnt, Type, Iface, R, Rmem, User, Inode} for key, val in proc_data.items(): if key in int_list: proc_data[key] int(val) return proc_data集合int_list精确列出了需要转换为整数的 7 个键sk与Proto不在其中保持字符串只有rawFalse默认时才调用_process因此 raw 模式下不会发生任何类型转换字段值全部是字符串需要注意当前实现假设输入只有一行数据取raw_output_list[0]若输入包含多行数据行从源码结构看只会返回第一行的解析结果。6.3 在 proc 总入口中的自动分派proc.py 定义了识别本文件的签名正则net_packet_p re.compile(r^sk RefCnt Type Proto Iface R Rmem User Inode\n)当输入以该精确表头开头时--proc会通过 proc.py 中的映射net_packet_p: proc_net_packet找到proc_net_packet子解析器再经 lib.py 中的get_parser()加载并调用其parse()。表头必须逐字符匹配包括连续空格数量这正是jc /proc/net/packet与jc --proc两种入口能够自动识别的前提。七、测试与夹具验证仓库为解析器提供了完整的单元测试与真实夹具测试文件 test_proc_net_packet.py包含两个用例——空数据输入返回{}以及真实夹具输入与预期 JSON 的完整断言输入夹具 net_packet1 行表头 1 行真实数据来自 Linux 系统的 packet socket 表预期输出夹具 net_packet.json{sk:ffff9b61b56c1800,RefCnt:3,Type:3,Proto:88cc,Iface:2,R:1,Rmem:0,User:101,Inode:34754}与上文 CLI 输出示例完全一致。该夹具同时验证了两个关键事实sk与Proto保持字符串、其余 7 个字段完成整数转换。运行仓库测试时./runtests.shtest_proc_net_packet会被自动执行可作为改动解析逻辑后的回归验证手段。八、实战场景与使用限制8.1 典型应用监控链路层收包程序通过Proto、Iface字段快速找出绑定在某网卡ifindex上监听特定协议如88ccLLDP、0806ARP、0800IPv4的 packet socket判断是否有应用在做链路层抓包排查 socket 泄漏RefCnt与Inode结合配合ls -l /proc/pid/fd可定位打开 packet socket 的进程与用户User字段给出 uid自动化脚本将解析结果管道给jq实现基于字段的过滤、聚合与告警例如统计各 uid 打开的 packet socket 数量、检测Rmem持续增长的接收队列积压。8.2 使用限制以当前仓库实现为准平台限制解析器compatible [linux]仅在 Linux 上原生运行无警告跨平台处理 Linux 采集的文件需使用-q/quietTrue单行数据从当前源码结构看解析器只处理第一行数据多行数据行的处理能力尚未体现无表头容错依赖 proc.py 中精确的正则签名识别表头表头格式异常如空格数量不一致可能导致自动识别失败并抛出ParseError(Proc file could not be identified.)proc.py隐藏解析器info.hidden True不会出现在常规jc -l列表需通过jc -hh查看或显式--proc-net-packet调用。九、与 jc 整体机制的衔接本解析器是 jc 的proc系列解析器家族中的一员proc-net-*子系列还包括 proc_net_arp.py、proc_net_netstat.py、proc_net_route.py 等完整列表见 lib.py 中的 CLI 名称注册。所有 proc 子解析器共享同一套设计模式info元数据类 parse(data, raw, quiet)入口 可选的_process类型转换 复用universal通用表格解析器。理解本解析器的实现即可举一反三掌握整个 proc 系列乃至 jc 全部表格类解析器如ls、ps、df的通用架构CLI 层通过--proc或独立参数分发模块层通过jc.parse()统一调度最终都收敛到简单表格解析 字段类型映射这一核心范式。赞分享开发工具【免费下载链接】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点击查看免费下载相关推荐Starship No Empty Icons 预设让运行时图标只在版本可确认时出现Starship No Empty Icons 预设让运行时图标只在版本可确认时出现 本文以 Starship 的 No Empty Icons 预设 为核心开发工具es-toolkit/compat 的 unzip 函数Lodash 兼容的矩阵转置与数据重组指南es toolkit/compat 的 unzip 函数Lodash 兼容的矩阵转置与数据重组指南 unzip 是 es toolkit 兼容层 es to开发工具jc proc-cpuinfo 解析器将 Linux /proc/cpuinfo 精准转换为结构化 JSONjc proc cpuinfo 解析器将 Linux /proc/cpuinfo 精准转换为结构化 JSON 本文基于 proc_cpuinfo 解析器文档开发工具上一篇揭秘BiliTools3分钟让B站视频变知识卡片的神奇AI功能下一篇5 分钟快速上手 LoadingAndRetryManagerAndroid 加载页与重试页无缝切换入门教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。