jc 解析 chage --list 输出:Linux 用户密码与账户过期策略的 JSON 结构化实战
发布时间:2026/9/25 2:43:50来源:尧图网络
开发工具【免费下载链接】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点击查看免费下载导读本文介绍开源项目 jcJSON Convert中chage解析器的完整用法它能把 Linux 下chage --list 用户名即chage -l输出的账户密码策略文本转换为结构化的 JSON、YAML 或 Python 字典。读完本文你将掌握 CLI 管道用法、Python 模块调用方式、输出 Schema 与raw原始模式的区别以及解析器在源码层级的实现原理可直接用于账户审计、过期监控和自动化运维脚本。chage 解析器是什么chage是 Linux 下的账户老化aging管理命令用于查看和修改用户密码过期信息。其-l/--list子命令会把密码更改时间、过期时间、不活动时间、账户到期日以及密码变更的最小/最大间隔天数、过期前警告天数打印为固定格式的多行文本。jc 的chage解析器jc/parsers/chage.py专门面向该输出格式将其解析为如下 Schema 对应的 JSON 结构{ password_last_changed: never, password_expires: never, password_inactive: never, account_expires: never, min_days_between_password_change: 0, max_days_between_password_change: 99999, warning_days_before_password_expires: 7 }从解析器元数据看jc/parsers/chage.py 中的info类该解析器版本为 1.1兼容平台为linux注册的 magic 命令为chage --list和chage -l标签为command。快速上手CLI 用法jc 安装后可以直接把chage的输出管道给jc --chage$ chage -l johndoe | jc --chage也可以让 jc 直接调用命令本身$ jc chage -l johndoe两种方式等价。实际运行示例-p表示美化打印 JSON$ chage --list joeuser | jc --chage -p { password_last_changed: never, password_expires: never, password_inactive: never, account_expires: never, min_days_between_password_change: 0, max_days_between_password_change: 99999, warning_days_before_password_expires: 7 }加上-rraw参数时数值字段不再转换全部以字符串输出$ chage --list joeuser | jc --chage -p -r { password_last_changed: never, password_expires: never, password_inactive: never, account_expires: never, min_days_between_password_change: 0, max_days_between_password_change: 99999, warning_days_before_password_expires: 7 }得到 JSON 后即可自由接驳jq等工具做过滤统计例如筛选出「密码永不更改」的用户或把账户到期日在 30 天内的用户列表导出用于告警。模块调用在 Python 中解析除了 CLIjc 也提供 Python 库接口。只需传入解析器名称chage和原始命令输出文本import jc result jc.parse(chage, chage_command_output)返回值是符合 Schema 的 Python 字典如果原始输出为多行字符串jc 会自动按行切分解析。需要处理脚本内的自动化场景时还可以组合使用jc.parsers.chage.parse()import jc.parsers.chage result jc.parsers.chage.parse(data, rawFalse, quietTrue)其中quietTrue会抑制平台兼容性等警告输出适合在后台任务或日志系统中使用。输出 Schema 详解解析后的数据结构字段与chage --list的原始输出行一一对应字段名类型对应原始输出行password_last_changedstringLast password changepassword_expiresstringPassword expirespassword_inactivestringPassword inactiveaccount_expiresstringAccount expiresmin_days_between_password_changeintegerMinimum number of days between password changemax_days_between_password_changeintegerMaximum number of days between password changewarning_days_before_password_expiresintegerNumber of days of warning before password expires要点日期类字段如password_last_changed、password_expires保持原始字符串可能为具体日期或never表示永不更改/永不过期三个数值字段在默认processed模式下会转换为整数。-rraw 模式下保持字符串原样never这一特殊取值对应chage输出中的 never 字样表示策略未启用对应限制例如account_expires: never表示账户永不过期。解析器的实现原理逐行解析key: value拆分核心解析逻辑位于 jc/parsers/chage.py 的parse()函数for line in filter(None, data.splitlines()): key, val line.split(:, maxsplit1) key key.strip() val val.strip()先通过data.splitlines()按行拆分并用filter(None, ...)剔除空行每行按第一个冒号:拆分maxsplit1保证值中如果包含冒号也不会被误切键值两侧strip()去除多余空白——chage输出中键名与冒号之间会有大量制表符和空格见 tests/fixtures/centos-7.7/chage.outstrip 正是为了处理这种对齐排版随后对已知的 7 个键名逐一匹配写入raw_output字典中的对应字段未识别的行会被忽略。类型转换_process_process()负责把默认模式下的三个数值字段转换为整数int_list {min_days_between_password_change, max_days_between_password_change, warning_days_before_password_expires} for key in proc_data: if key in int_list: proc_data[key] jc.utils.convert_to_int(proc_data[key])convert_to_int定义于 jc/utils.py它会先用正则剥离字符串中的非数字字符再尝试转为int失败时返回None。因此即便chage输出中数值两侧带有多余空白也能得到干净的整数rawTrue时则跳过_process直接返回raw_output数值保持字符串。前置检查与容错parse()开头依次调用jc.utils.compatibility(__name__, info.compatible, quiet)检查运行平台是否属于linux见info.compatible非 Linux 平台且quietFalse时向 STDERR 打印兼容性警告jc.utils.input_type_check(data)强制要求输入为str否则抛出TypeErrorjc.utils.has_data(data)若输入只有空白字符则视为无数据直接返回空字典{}。对应测试 tests/test_chage.py 中有两条用例空输入返回{}以及用 CentOS 7.7 的真实输出 fixturetests/fixtures/centos-7.7/chage.out校验解析结果与预期 JSONtests/fixtures/centos-7.7/chage.json完全一致。fixture 内容如下Last password change : never Password expires : never Password inactive : never Account expires : never Minimum number of days between password change : 0 Maximum number of days between password change : 99999 Number of days of warning before password expires : 7可以看到键名与冒号之间夹杂了大量制表符这正是解析器必须依赖strip()的原因。典型实战场景1. 批量审计密码策略将用户列表循环取出交给 jc 解析后统一入库for u in $(cut -d: -f1 /etc/passwd); do chage -l $u | jc --chage done配合jq可快速找出max_days_between_password_change过大或password_expires为never的账户用于安全合规检查。2. 账户过期预警在 cron 或监控脚本中调用 Python 模块把account_expires解析后与当前日期比较即可在账户到期前自动告警避免服务因账户过期而中断。3. 与-r原始模式结合需要保留原始字符串语义例如日期字段两侧的空白、数值未归一化做兼容处理时使用-r拿到「预处理 JSON」字段类型与chage输出完全一致便于逐字节对比或归档原始证据。适用前提与限制解析器compatible列表仅为linux见 jc/parsers/chage.py 的info类在 macOS/Windows 等平台调用会收到兼容性警告quietTrue可抑制且结果依赖该系统chage的输出格式仅支持chage -l/chage --list的输出chage的其他子命令如修改策略的交互式用法不属于本解析器范围若某系统chage输出的键名文本与上述 7 个键不完全一致例如不同发行版的本地化输出相应行会被忽略解析结果字段会缺失请在目标发行版上先用chage -l user实测确认输出格式仓库在 tests/fixtures/centos-7.7/chage.out 中给出了 CentOS 7.7 的参考格式。小结jc --chage用约 80 行源码jc/parsers/chage.py把chage --list的排版文本变成可直接消费的 JSON/字典配合jq和脚本可以显著简化账户策略审计与过期监控流程。掌握raw参数与类型转换行为后你便能在不同发行版间稳妥地自动化处理密码老化信息。赞分享开发工具【免费下载链接】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 的 os-prober 解析器把 Linux 启动分区探测输出结构化为 JSONjc 的 os prober 解析器把 Linux 启动分区探测输出结构化为 JSON os prober 是 Linux 系统中用于探测磁盘分区上已安装操作开发工具jc 的 pacman 解析器把 Arch Linux 包查询输出结构化为 JSON 的完整用法与实现剖析jc 的 pacman 解析器把 Arch Linux 包查询输出结构化为 JSON 的完整用法与实现剖析 本文围绕 jc 仓库中的 pacman 解析器展开开发工具JDspyder终极指南从手动抢购到自动化秒杀的完整解决方案JDspyder终极指南从手动抢购到自动化秒杀的完整解决方案 在电商促销和热门商品抢购的战场上每一秒都意味着成功与失败的分界线。JDspyder正是为打破这开发工具上一篇缓存管理策略CacheUtil和LRUCacheUtil的性能优化之道下一篇如何用AI与机器学习彻底改变软件测试howtheytest揭示的8大趋势与完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网