- 开发工具
【免费下载链接】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.
本篇技术指南聚焦 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 --gshadow2.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_name | string | 第 1 段 | 组名,对应/etc/group中的组 |
password | string | 第 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)参数说明:
| 参数 | 类型 | 默认值 | 作用 |
|---|---|---|---|
data | string | 必填 | 待解析的/etc/gshadow文件文本内容 |
raw | boolean | False | 为True时返回未处理的原始结构化数据(保留['']) |
quiet | boolean | False | 为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的解析流程非常清晰,可拆解为以下步骤:
- 按行拆分:
data.splitlines()将整个文件内容按换行拆分为行列表; - 过滤空行:
list(filter(None, cleandata))剔除空行,避免空行产生脏记录; - 跳过注释:以
#开头的行被continue跳过,/etc/gshadow中的注释行不会进入输出; - 冒号分段:
entry.split(':')将每行拆为group_name、password、administrators、members四个字段; - 逗号拆分列表:
fields[2].split(',')与fields[3].split(',')将管理员与成员分别拆成字符串数组; - 空列表规整:非 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.
相关推荐
jc os_release 解析器:将 /etc/os-release 转为 JSON 字典的别名解析器实现详解
jc os_release 解析器:将 /etc/os release 转为 JSON 字典的别名解析器实现详解 os_release 是 jc(JSON Co
开发工具jc 流式解析器 ping_s 实战:将 ping / ping6 输出实时转换为 JSON Lines
jc 流式解析器 ping_s 实战:将 ping / ping6 输出实时转换为 JSON Lines jc(JSON Convert)提供了流式(strea
开发工具jc lsof 解析器详解:将进程打开文件列表(lsof)转换为结构化 JSON
jc lsof 解析器详解:将进程打开文件列表(lsof)转换为结构化 JSON 本文以 jc/parsers/lsof.py https://link.git
开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考