jc 解析 /proc/net/unix:将 Linux 内核 UNIX 域套接字表转换为 JSON
发布时间:2026/9/26 3:14:22来源:尧图网络
开发工具【免费下载链接】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/unix是 Linux 内核导出的一个虚拟文件记录了当前系统中所有 UNIX 域套接字Unix domain socket的内核级状态包括套接字地址、引用计数、协议、类型、状态以及绑定路径。本指南围绕 jc 项目CLI tool and python library用于把常见命令输出与文件类型转换为 JSON/YAML/Dictionary中的proc_net_unix解析器展开说明如何通过命令行或 Python 模块将该文件内容结构化并结合源码解释字段含义、转换逻辑与测试验证。读完本文你将掌握jc --proc-net-unix与jc.parse(proc_net_unix, ...)的完整用法、输出 Schema、原始/处理两种模式的区别以及解析器底层的实现原理。一、/proc/net/unix 文件概览/proc/net/unix是 Linux procfs 提供的只读文本表列头为Num RefCount Protocol Flags Type St Inode Path每一行对应一个 UNIX 域套接字其中Num是内核内部套接字指针以十六进制地址形式展示Path为可选的绑定路径——未绑定的套接字该列为空。该文件由内核动态生成典型输出包含 systemd、D-Bus、snapd、gpg-agent 等系统服务的监听套接字例如ffff9b61ac49c400: 00000002 00000000 00010000 0001 01 42776 /var/snap/lxd/common/lxd/unix.socket ffff9b61b509bc00: 00000002 00000000 00010000 0001 01 35128 /var/run/vmware/guestServicePipe ffff9b61a77b9800: 00000002 00000000 00010000 0005 01 29792 /run/udev/control可以看到各行以空格分隔、对齐并不严格末列Path本身可以包含空格直接做文本处理容易出错。这正是 jc 提供专用解析器的原因。仓库中的真实样例见 tests/fixtures/linux-proc/net_unix其中还包含大量Path为空的未绑定套接字条目可用于验证解析器对空列的容忍能力。二、命令行用法proc_net_unix解析器有两种命令行入口文档与源码jc/parsers/proc_net_unix.py中均有说明方式一通过通用的--proc选项自动识别文件类型$ cat /proc/net/unix | jc --proc方式二直接把文件路径作为参数交给 jc同样走自动识别逻辑$ jc /proc/net/unix方式三显式指定专用解析器选项--proc-net-unix$ cat /proc/net/unix | jc --proc-net-unix--proc-net-unix是 jc 在 jc/lib.py 中注册的正式解析器名位于proc-net-tcp与proc-pid-fdinfo之间并与proc_net_unix模块一一对应这一点与文档中模块用法的命名proc_net_unix相呼应CLI 名称使用连字符、模块名称使用下划线。常用输出选项-p输出格式化prettyJSON便于阅读-r输出原始raw结构跳过类型转换等后处理步骤-y输出 YAML可选与其它解析器一致。示例格式化 JSON 输出$ cat /proc/net/unix | jc --proc -p [ { Num: ffff9b61ac49c400:, RefCount: 00000002, Protocol: 00000000, Flags: 00010000, Type: 0001, St: 01, Inode: 42776, Path: /var/snap/lxd/common/lxd/unix.socket }, ... ]示例原始输出Inode 保持字符串形式$ cat /proc/net/unix | jc --proc-net-unix -p -r [ { Num: ffff9b61ac49c400:, RefCount: 00000002, Protocol: 00000000, Flags: 00010000, Type: 0001, St: 01, Inode: 42776, Path: /var/snap/lxd/common/lxd/unix.socket }, ... ]对比可见处理模式默认下Inode会被转换为整数42776而原始模式下保持字符串42776。三、Python 模块用法作为 Python 库proc_net_unix可通过 jc 的统一入口jc.parse()调用同样有两种命名方式import jc # 方式一使用通用 proc 解析器名由 proc.py 按文件头自动分派 result jc.parse(proc, proc_net_unix_file) # 方式二直接使用专用解析器名 result jc.parse(proc_net_unix, proc_net_unix_file)两种方式返回的都是List[Dict]类型的结构化数据即一组字典构成的列表。parse 函数签名解析器对外暴露的核心接口定义在 jc/parsers/proc_net_unix.pydef parse( data: str, raw: bool False, quiet: bool False ) - List[Dict]:参数说明参数类型默认值含义datastring必填待解析的文本数据即/proc/net/unix文件内容rawbooleanFalse为True时返回未经过类型转换的原始结构化数据quietbooleanFalse为True时抑制警告信息如平台兼容性提示返回值为List of DictionariesrawTrue时是原始结构否则为符合 Schema 的处理后结构。四、输出 Schema文档定义的 Schema 如下处理模式下各字段的数据类型[ { Num: string, RefCount: string, Protocol: string, Flags: string, Type: string, St: string, Inode: integer, Path: string } ]各字段语义结合 Linux 内核net/unix/af_unix.c的导出格式约定字段类型说明Numstring内核套接字对象地址十六进制末尾带冒号如ffff9b61ac49c400:可用于关联同一套接字的其他 proc 输出RefCountstring套接字引用计数十六进制字符串如00000002、0000000AProtocolstring套接字协议号十六进制字符串UNIX 域套接字通常为00000000Flagsstring套接字标志位十六进制字符串例如00010000表示设置了监听相关标志Typestring套接字类型十六进制字符串0001对应 SOCK_STREAM0002对应 SOCK_DGRAM0005对应 SOCK_SEQPACKETStstring套接字连接状态十六进制字符串按内核约定01表示未连接UNCONNECTED03表示已连接CONNECTEDInodeinteger套接字对应的 inode 编号处理模式下由字符串转为整数可用于与/proc/net/tcp等输出或ss结果交叉比对Pathstring套接字绑定的文件系统路径若未绑定则此字段为空字符串原始输出中该键同样存在值为空需要注意除Inode外其余字段在处理模式下仍保持字符串且保留原始十六进制格式不做数值化这是为了忠实保留内核输出的原始语义。Path可能为空——真实样例tests/fixtures/linux-proc/net_unix中有大量无路径条目如仅ffff9b61b0e55400: 00000003 00000000 00000000 0002 01 41865一行解析器会将其Path置为空字符串输出结果中该键依然存在。五、实现原理从文本表到字典列表proc_net_unix的实现非常简洁整个模块约 140 行核心思路是复用 jc 通用解析器simple_table_parse再做一层类型后处理。1. 底层表解析在 jc/parsers/proc_net_unix.py 中if jc.utils.has_data(data): raw_output simple_table_parse(data.splitlines())simple_table_parse定义于 jc/parsers/universal.py它按以下规则工作取第 0 行表头作为列名自动将表头中的空格压缩并按空白切分其余每一行按split(None, len(headers) - 1)切分——即前 N-1 列按空白分隔最后一列保留剩余全部内容包括空格将表头与每行数据zip成字典并收集为列表。这一设计恰好适配/proc/net/unix的格式前 6 列Num到St都是不含空格的十六进制字段而末列Path理论上可以包含空格simple_table_parse保证整条路径被完整保留。其 docstring 明确要求调用方传入的列表第 0 项必须是表头行proc_net_unix正是这样使用它的。2. 类型后处理_process函数jc/parsers/proc_net_unix.py负责把 Schema 中标记为整数的字段做类型转换def _process(proc_data: List[Dict]) - List[Dict]: int_list {Inode} for entry in proc_data: for key, val in entry.items(): if key in int_list: entry[key] int(val) return proc_data这里int_list {Inode}是 Schema 中唯一需要整数化的字段其余字段Num、RefCount、Protocol、Flags、Type、St、Path保持字符串。parse函数的返回逻辑为return raw_output if raw else _process(raw_output)即rawTrue时跳过_process直接返回simple_table_parse的原始结果。3. 前置校验与元数据parse入口先做两件事jc/parsers/proc_net_unix.pyjc.utils.compatibility(__name__, info.compatible, quiet) jc.utils.input_type_check(data)compatibility检查运行平台是否与info.compatible [linux]匹配该解析器声明只兼容 Linux不匹配时给出警告quietTrue可抑制input_type_check校验输入确为字符串。模块顶部的info类jc/parsers/proc_net_unix.py还登记了解析器元数据版本1.0、作者 Kelly Brazil、描述/proc/net/unixfile parser、标签[file]并且hidden True——意味着它是作为--proc总入口的分派子解析器存在不单独出现在通用解析器列表顶层。4. 在 --proc 总入口中的自动识别当你使用jc --proc时分派逻辑位于 jc/parsers/proc.py。其中用正则锁定该文件头部特征net_unix_p re.compile(r^Num RefCount Protocol Flags Type St Inode Path\n)并在procmap中将该模式映射到解析器名jc/parsers/proc.pynet_unix_p: proc_net_unix,也就是说只要输入文本以Num RefCount Protocol Flags Type St Inode Path表头开头--proc就会自动路由到proc_net_unix解析器——这就是cat /proc/net/unix | jc --proc能直接工作的原因。值得留意的是procmap中还存在net_tcp_p、net_packet_p、net_route_p等兄弟解析器它们共同覆盖/proc/net/下的各类内核网络表。六、测试验证仓库为proc_net_unix提供了单元测试与真实夹具数据可直接验证解析器行为测试文件tests/test_proc_net_unix.py输入夹具tests/fixtures/linux-proc/net_unix131 行真实内核输出期望输出tests/fixtures/linux-proc/net_unix.json与输入逐行对应的 JSON 数组测试覆盖两类场景def test_proc_net_unix_nodata(self): Test proc_net_unix with no data self.assertEqual(jc.parsers.proc_net_unix.parse(, quietTrue), []) def test_proc_net_unix(self): Test /proc/net/unix self.assertEqual(jc.parsers.proc_net_unix.parse(self.f_in[proc_net_unix], quietTrue), self.f_json[proc_net_unix])空输入parse(, quietTrue)返回[]因为jc.utils.has_data(data)对空字符串返回 False直接跳过解析正常输入解析结果与夹具 JSON 完全一致其中可确认Inode字段确实被转换为整数如夹具中第一条Inode: 42776而Num、St等字段保持字符串。这意味着任何对--proc-net-unix输出的改造都可借助这套夹具做回归验证。七、实战应用示例将/proc/net/unix结构化之后就可以直接交给 jq 等工具做过滤与统计。例如查看所有已绑定路径的流式套接字$ cat /proc/net/unix | jc --proc | jq .[] | select(.Path ! ) | {Type, St, Path} { Type: 0001, St: 01, Path: /var/snap/lxd/common/lxd/unix.socket } ...统计监听套接字数量并去重$ cat /proc/net/unix | jc --proc | jq [.[] | select(.Path ! ) | .Path] | unique | length在 Python 中则可以直接遍历字典import jc with open(/proc/net/unix) as f: sockets jc.parse(proc_net_unix, f.read()) bound [s[Path] for s in sockets if s[Path]] print(f共发现 {len(sockets)} 个 UNIX 域套接字其中 {len(bound)} 个已绑定路径)八、注意事项与限制平台限制解析器声明compatible [linux]/proc/net/unix本身是 Linux procfs 特性macOS/BSD 等平台无此文件字段不变性除Inode外所有字段保持字符串与十六进制原样如需十进制数值或按Type/St语义分组需在应用侧自行转换空 Path未绑定路径的套接字其Path为空字符串过滤时注意select(.Path ! )这类条件-r模式的用途当需要保留原始十六进制/字符串形态例如把Inode也作为字符串写入日志时使用-r默认处理模式更便于数值运算。相关资源解析器文档docs/parsers/proc_net_unix.md解析器实现jc/parsers/proc_net_unix.py通用表解析工具jc/parsers/universal.py--proc自动分派jc/parsers/proc.py解析器注册表jc/lib.py单元测试tests/test_proc_net_unix.py测试夹具tests/fixtures/linux-proc/net_unix 与 tests/fixtures/linux-proc/net_unix.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 解析 /proc/net/packet将 Linux Packet 套接字表转换为结构化 JSONjc 解析 /proc/net/packet将 Linux Packet 套接字表转换为结构化 JSON 导读 /proc/net/packet 是 Linu开发工具jc 解析 /proc/net/tcp 与 /proc/net/tcp6把内核 TCP 套接字表转换为结构化 JSONjc 解析 /proc/net/tcp 与 /proc/net/tcp6 把内核 TCP 套接字表转换为结构化 JSON 本文介绍 jc 项目中负责解析 Li开发工具jc 解析 /proc/net/ipv6_route 路由表将 Linux IPv6 路由表转换为 JSONjc 解析 /proc/net/ipv6_route 路由表将 Linux IPv6 路由表转换为 JSON 导读 /proc/net/ipv6_route开发工具上一篇oh-my-pi 的 MiniMax 带内工具协议minimax:tool_call Owned 方言全解析下一篇GPT Researcher 配置体系详解环境变量、JSON 配置与默认值三层优先级的完整参考创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网