ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

jc 的 systemctl-ls 解析器实战:将 `systemctl list-sockets` 输出一键转换为 JSON

jc 的 systemctl-ls 解析器实战:将 `systemctl list-sockets` 输出一键转换为 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 项目中systemctl_ls解析器展开讲解如何把 Linux systemd 下systemctl list-sockets命令的输出转换为结构化 JSON并深入剖析其 schema、CLI/模块调用方式、源码解析原理与真实平台测试样例。读完本文你将掌握 socket 监听信息的自动化采集方法并能基于解析器的边界处理逻辑写出稳定可靠的脚本。一、解析器定位从 systemd socket 列表到结构化数据systemctl list-sockets是 systemd 提供的一个只读命令用于列出当前系统中所有由 systemd 管理的 socket 单元socket unit及其监听地址、对应单元文件与激活的目标服务。在 Linux 服务器上排查服务监听端口、socket 激活socket activation配置时非常常用但其默认输出是纯文本表格不利于脚本直接消费。jc 项目提供的systemctl_ls解析器文档位于 docs/parsers/systemctl_ls.md实现位于 jc/parsers/systemctl_ls.py正是为了解决这个问题它把systemctl list-sockets的表格输出转换为 JSON、YAML 或 Python 字典从而可以继续通过管道交给jq等工具处理或直接在 Python 程序中遍历。该解析器的元信息声明其description为 systemctl list-socketscommand parsercompatible平台为linux版本为 1.5参见 jc/parsers/systemctl_ls.py 中info类。二、两种调用方式CLI 与 Python 模块2.1 CLI 方式管道最直接的用法是把systemctl list-sockets的输出通过管道交给 jc指定解析器名systemctl-ls$ systemctl list-sockets | jc --systemctl-ls2.2 CLI 方式直接传参jc 的 CLI 也支持直接以命令形式调用由 jc 内部代为执行并解析$ jc systemctl list-sockets该解析器在 jc 的解析器注册表中登记的名字为systemctl-ls见 jc/lib.py 中解析器列表的systemctl-ls条目。这也与info类中声明的magic_commands [systemctl list-sockets]相对应——jc 会根据这个魔法命令列表识别对应的原始命令。2.3 Python 模块方式在 Python 中先import jc再调用jc.parse()第一个参数传解析器名systemctl_ls模块名下划线形式第二个参数传systemctl list-sockets的原始输出文本import jc result jc.parse(systemctl_ls, systemctl_ls_command_output)result是一个列表列表中每个元素是一个字典可直接被 Python 程序消费或通过json.dumps()序列化后供其他系统使用。三、输出 Schema 与字段语义解析器输出的数据结构为「列表套字典」每个字典对应输出表格中的一行[ { listen: string, unit: string, activates: string } ]三个字段的含义如下字段类型来源列含义listenstringLISTENsocket 实际监听的地址Unix socket 路径、IPv4/IPv6 地址端口、netlink 等unitstringUNIT负责该监听的 socket 单元文件如dbus.socketactivatesstringACTIVATES该 socket 激活后启动的服务单元如dbus.service需要特别说明的是activates字段在真实输出中可能为空。例如当 socket 单元没有关联的服务激活目标时systemctl list-sockets的 ACTIVATES 列就是空白解析后该字典中不会出现activates键。这一点在测试夹具中可以直接观察到详见下文第四节与第六节。四、完整示例-p美化输出文档中给出的典型输出示例如下-p表示 pretty 打印美化缩进$ systemctl list-sockets | jc --systemctl-ls -p [ { listen: /dev/log, unit: systemd-journald.socket, activates: systemd-journald.service }, { listen: /run/dbus/system_bus_socket, unit: dbus.socket, activates: dbus.service }, { listen: /run/dmeventd-client, unit: dm-event.socket, activates: dm-event.service }, ... ]可以看到/dev/logsyslog 日志套接字、/run/dbus/system_bus_socketD-Bus 系统总线这类典型的 systemd 监听地址都被完整保留为字符串。省略号...表示真实系统中还会有更多条目。五、parse函数签名与参数说明解析器暴露的唯一公开接口是parse函数签名如下def parse(data, rawFalse, quietFalse)参数类型默认值说明datastring必传待解析的systemctl list-sockets原始文本rawbooleanFalse为True时返回未进一步处理的原始结构化数据quietbooleanFalse为True时抑制警告信息如平台兼容性提示返回值字典列表List of Dictionaries即 raw 或 processed 形式的结构化数据。从源码实现看jc/parsers/systemctl_ls.pyparse的完整流程为调用jc.utils.compatibility(__name__, info.compatible, quiet)检查平台兼容性compatible [linux]非 Linux 平台会给出警告除非quietTrue调用jc.utils.input_type_check(data)校验输入类型通过list(filter(None, data.splitlines()))剔除空行调用jc.utils.has_data(data)判断是否有可解析的数据无数据时返回空列表[]逐行清理非 ASCII 字符首行作为表头其余行作为数据行解析遇sockets listed.结束行停止解析根据raw参数决定返回原始结构还是经过_process()处理的结构。六、源码级原理剖析表格解析的边界处理6.1 表头驱动动态生成键名解析器不硬编码字段名而是取首行表头并统一转小写、按空白切分再与每行数据用zip组合成字典header_text cleandata[0].lower() header_list header_text.split() ... output_line dict(zip(header_list, entry_list))这意味着只要systemctl list-sockets的表头列顺序不变键名就自动与列对应源码中无需维护第二份列名映射降低了与 systemd 版本变化之间的耦合风险。6.2 从右侧切分巧解「监听地址含空格」systemctl list-sockets的真实输出中LISTEN 列可能包含空格。以测试夹具 tests/fixtures/centos-7.7/systemctl-ls.out 为例存在如下行kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service route 1361 systemd-networkd.socket systemd-networkd.service audit 1 systemd-journald-audit.socket systemd-journald.servicekobject-uevent 1、route 1361、audit 1分别是 netlink 与 audit 子系统的监听标识监听地址本身包含空格。由于 UNIT 与 ACTIVATES 两列总是位于行尾且本身不含空格解析器采用entry.rsplit(maxsplit2)从右侧切分出最后两个字段作为unit和activates剩余部分整体作为listen从而正确处理这类边界行。这是该解析器实现中最值得借鉴的细节。6.3 提前结束识别汇总行systemctl list-sockets的输出末尾会有一行汇总例如14 sockets listed.。解析器在遍历数据行时遇到包含sockets listed.的行立即break不会把汇总行误解析成一条 socket 记录。6.4 空字段的处理ACTIVATES 列可能为空。例如 CentOS 7.7 夹具中的这一行[::]:22 sshd.socketsshd.socket没有对应的激活服务列。由于解析器只把切分得到的字段与表头 zip空字段不会生成键因此对应 JSON 对象只有listen与unit两个键。这在夹具期望输出 tests/fixtures/centos-7.7/systemctl-ls.json 中可以直接验证{listen: [::]:22, unit: sshd.socket}6.5raw参数与_process钩子源码中的_process(proc_data)目前只是直接返回入参# nothing more to process。因此在本版本v1.5中rawTrue与默认处理的结果是一致的。但这一层抽象保留了未来做字段归一化、类型转换的扩展点调用方仍建议按raw语义区分使用场景需要「原样结构化」时传rawTrue需要「规范化 schema」时走默认路径。6.6 无数据输入当输入为空字符串时has_data判断不成立解析器直接返回[]。测试用例test_systemctl_ls_nodata对此做了专门断言见 tests/test_systemctl_ls.py保证脚本对空输出不会抛异常。七、真实平台验证测试夹具与用例该解析器在 tests/test_systemctl_ls.py 中覆盖了两个真实发行版的输出测试用例平台输入夹具期望输出夹具说明test_systemctl_ls_nodata—空字符串[]无数据输入test_systemctl_ls_centos_7_7CentOS 7.7tests/fixtures/centos-7.7/systemctl-ls.outtests/fixtures/centos-7.7/systemctl-ls.json14 个 socket含sshd.socket无激活服务等边界行test_systemctl_ls_ubuntu_18_4Ubuntu 18.04tests/fixtures/ubuntu-18.04/systemctl-ls.out同名.json夹具24 个 socket含route 1361、audit 1等多词监听地址Ubuntu 18.04 夹具还包含ISCSIADM_ABSTRACT_NAMESPACE这类 Linux 抽象命名空间套接字以及/var/run/docker.sock、/var/lib/lxd/unix.socket等常见容器运行时 socket说明解析器对多样化的监听地址格式均有覆盖。测试用例通过unittest框架断言parse()的实际输出与期望 JSON 完全相等任何表头变化或切分逻辑回归都会导致测试失败因此该解析器的行为有持续回归保障。八、在 jc 解析器家族中的位置jc 为 systemd 系命令提供了多个解析器systemctl-ls只是其中之一。在 jc/lib.py 的解析器注册表中可以看到完整的家族成员systemctlsystemctl默认输出、systemctl-ljsystemctl list-jobs、systemctl-ls本文主题systemctl list-sockets、systemctl-lufsystemctl list-unit-files。它们都遵循相同的设计模式文档位于 docs/parsers 目录如 docs/parsers/systemctl_ls.md实现位于 jc/parsers测试位于 tests夹具存放在 tests/fixtures 下各发行版目录。当需要同时采集 socket 监听、unit 文件状态等信息时可以分别调用对应解析器再把结果合并到自己的监控数据模型中。九、实战建议与限制平台限制systemctl list-sockets是 systemd 特有命令该解析器compatible声明仅为linux不适用于 macOS/BSD 等平台字段缺失activates字段可能缺失消费方代码应使用dict.get(activates)而非直接索引避免KeyError多词监听地址listen字段可能包含空格如 netlink 标识解析结果中它始终是完整字符串无需额外拼接脚本化采集推荐用管道方式配合jq过滤例如systemctl list-sockets | jc --systemctl-ls | jq .[] | select(.activates ! null) | {listen, activates}即可快速得到所有具备激活服务的监听地址清单空输出容错未运行 systemd 或无 socket 时命令输出可能为空parse会安全返回[]脚本无需额外判空分支。综上systemctl_ls解析器以约百行 Python 实现了对 systemd socket 列表的高健壮性解析其「表头动态建键 右侧切分 结束行识别」的实现思路也值得在其它表格型 CLI 输出解析场景中复用。赞分享开发工具【免费下载链接】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 --gpg 将 gpg --with-colons 输出转换为 JSONjc 解析器实战使用 jc gpg 将 gpg with colons 输出转换为 JSON 导读 本文介绍 jcJSON Convert项目中的 gpg开发工具基于 Rube MCP 与 Composio 实现 AI ML API 自动化awesome-codex-skills 实战指南基于 Rube MCP 与 Composio 实现 AI ML API 自动化awesome codex skills 实战指南 导读 本文以开源仓库 awe开发工具jc 解析器实战将 debconf-show 包配置输出转换为 JSONjc 解析器实战将 debconf show 包配置输出转换为 JSON 本指南围绕 jc 项目的 debconf show 解析器展开讲解如何把 Debi开发工具上一篇探秘高效能视频编码新星Kvazaar下一篇Backdoorme终极指南掌握持久性后门管理利器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表