☰
jc 解析器实战:用 jc 将 /etc/gshadow 组影子文件转换为 JSON
2026/9/25 3:32:45 网站建设 项目流程
  • 开发工具

【免费下载链接】jc

CLI 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(JSON Convert)项目中的gshadow文件解析器,讲解如何将 Linux 系统下的/etc/gshadow组影子文件通过 CLI 管道或 Python 模块调用转换为结构化 JSON/YAML 数据,并深入解析其底层实现(字段拆分、空列表规整、注释过滤等),让读者能够将该解析器直接接入系统运维与自动化脚本中。

一、/etc/gshadow与 jc 的 gshadow 解析器

/etc/gshadow是类 Unix 系统(Linux 等)中与/etc/group对应的"影子"文件,用于存放组密码哈希、组管理员列表与组成员列表等敏感信息,通常仅 root 用户可读。在 jc 项目中,gshadow 解析器 将该文本文件逐行解析为 JSON 数组,便于通过jq等工具进一步筛选与处理。

该解析器在 parser 注册表 中以gshadow名称注册,标记为file类型(tags),兼容linux、aix、freebsd三种平台,当前版本为 1.3(作者 Kelly Brazil)。

二、快速上手:CLI 用法与模块用法

2.1 CLI 管道用法

最直接的方式是读取/etc/gshadow并通过--gshadow参数交给 jc 解析:

$ cat /etc/gshadow | jc --gshadow

2.2 Python 模块用法

在 Python 脚本中,可通过jc.parse()统一入口调用:

import jc result = jc.parse('gshadow', gshadow_file_output)

其中gshadow_file_output为/etc/gshadow文件内容的字符串,返回值为"字典列表"(List of Dictionaries),可直接用于后续业务处理或序列化输出。

三、输出 Schema:四个结构化字段

gshadow解析器输出的每条记录包含 4 个字段,schema 定义如下:

[ { "group_name": string, "password": string, "administrators": [ string ], "members": [ string ] } ]

字段含义与/etc/gshadow每行的四个冒号分隔段一一对应:

字段类型来源段说明
group_namestring第 1 段组名,对应/etc/group中的组
passwordstring第 2 段组密码字段,通常为空、*、!或加密哈希
administrators字符串数组第 3 段组管理员用户名列表,按逗号拆分
members字符串数组第 4 段组成员用户名列表,按逗号拆分

四、输出示例:普通模式与原始模式对比

4.1 普通输出(-p美化打印)

$ cat /etc/gshadow | jc --gshadow -p [ { "group_name": "root", "password": "*", "administrators": [], "members": [] }, { "group_name": "adm", "password": "*", "administrators": [], "members": [ "syslog", "joeuser" ] }, ... ]

4.2 原始输出(-p -r保留未处理数据)

$ cat /etc/gshadow | jc --gshadow -p -r [ { "group_name": "root", "password": "*", "administrators": [ "" ], "members": [ "" ] }, { "group_name": "adm", "password": "*", "administrators": [ "" ], "members": [ "syslog", "joeuser" ] }, ... ]

两种模式的核心差异:原始模式(-r,即raw=True)直接返回fields[2].split(',')与fields[3].split(',')的结果——当某组没有管理员或成员时,第三、四段为空字符串,''.split(',')会产生['']这样的"含一个空字符串的列表";而普通模式经过 gshadow.py 中的_process()后处理,会将['']规整为空数组[],使输出更符合直觉。这正是测试 fixture 中 ubuntu-18.04/gshadow.json 与 centos-7.7/gshadow.json 里administrators与members均为[]的原因。

五、parse() 函数 API 详解

gshadow解析器对外暴露的核心入口为parse()函数,签名如下:

def parse(data, raw=False, quiet=False)

参数说明:

参数类型默认值作用
datastring必填待解析的/etc/gshadow文件文本内容
rawbooleanFalse为True时返回未处理的原始结构化数据(保留[''])
quietbooleanFalse为True时抑制警告消息(如平台兼容性提示)

返回值:字典列表(List of Dictionaries),即上文 Schema 所示结构。

从源码看,parse()的第一步会调用jc.utils.compatibility(__name__, info.compatible, quiet)检查当前运行平台是否在linux/aix/freebsd兼容列表中,并调用jc.utils.input_type_check(data)校验输入类型,随后才进入实际的文本解析流程。

六、源码级解析流程:从文本到结构化数据

jc/parsers/gshadow.py的解析流程非常清晰,可拆解为以下步骤:

  1. 按行拆分:data.splitlines()将整个文件内容按换行拆分为行列表;
  2. 过滤空行:list(filter(None, cleandata))剔除空行,避免空行产生脏记录;
  3. 跳过注释:以#开头的行被continue跳过,/etc/gshadow中的注释行不会进入输出;
  4. 冒号分段:entry.split(':')将每行拆为group_name、password、administrators、members四个字段;
  5. 逗号拆分列表:fields[2].split(',')与fields[3].split(',')将管理员与成员分别拆成字符串数组;
  6. 空列表规整:非 raw 模式下,_process()将['']替换为[]。

其中第 3 步的注释过滤、第 5 步的多值拆分,使该解析器能够正确处理包含syslog,joeuser这类多成员记录与#注释行的真实系统文件。

七、真实数据验证:CentOS 与 Ubuntu 平台差异

仓库的测试 fixture 提供了两个真实平台的/etc/gshadow样例,可直接验证解析器行为:

  • centos-7.7/gshadow.out:大量系统组密码段为空字符串(root:::形式),服务类组为!,如joeuser:!!::joeuser;
  • ubuntu-18.04/gshadow.out:系统组密码段多为*(如root:*::),且包含带成员的组,如adm:*::syslog,joeuser。

两种平台在解析后均统一输出为一致的 JSON 结构,tests/test_gshadow.py 中test_gshadow_centos_7_7与test_gshadow_ubuntu_18_4两个测试用例即断言解析结果与对应 fixture JSON 完全一致;此外test_gshadow_nodata验证空输入(parse('', quiet=True))返回空列表[],保证了解析器对无数据场景的健壮性。

八、实战场景与扩展用法

将/etc/gshadow解析为 JSON 后,可借助 jq 进行各类组管理审计:

# 列出所有含成员的组及其成员 $ cat /etc/gshadow | jc --gshadow | jq '.[] | select(.members != [])' # 统计组数量 $ cat /etc/gshadow | jc --gshadow | jq 'length' # 筛选密码字段为 "!"(锁定)的组 $ cat /etc/gshadow | jc --gshadow | jq '.[] | select(.password == "!")'

若需 YAML 输出,可在 jc 命令后追加-y参数转换;在 Python 侧,jc.parse('gshadow', data)返回的字典列表可直接用于脚本内逻辑判断或写入数据库。该解析器与 jc 项目中的 group 解析器(/etc/group)互为补充,可共同覆盖 Linux 组管理场景的自动化分析需求。

注意:/etc/gshadow通常需要 root 权限读取;实际使用时请结合系统权限与安全策略合理访问该文件。

  • 开发工具

【免费下载链接】jc

CLI 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
点击查看免费下载
上一篇:amd/realesrgan-256x256-tiles-amdnpu性能优化:256x256 tile设计如何平衡速度与画质?
下一篇:LibreNMS Docker性能优化:7个提升监控效率的技巧

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询