ARTICLE DETAIL

资讯详情

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

jc 解析 /etc/passwd:将 Linux/macOS 用户账户数据库转为 JSON 的完整指南

jc 解析 /etc/passwd:将 Linux/macOS 用户账户数据库转为 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点击查看免费下载/etc/passwd是 Linux、macOS 等类 Unix 系统上最基础的账户信息文件但它的冒号分隔文本格式并不适合脚本与自动化工具直接消费。本文围绕 jc 项目中专为该文件设计的解析器jc.parsers.passwd见 jc/parsers/passwd.py 与其文档 docs/parsers/passwd.md讲解如何通过 CLI 与 Python 模块两种方式把/etc/passwd的输出转换成结构化的 JSON / 字典列表并深入解析其源码实现、Schema 与边界行为。读完本文你将能在 Shell 管道中直接jq查询用户信息也能在自己的 Python 脚本中复用该解析逻辑。一、解析器定位为什么需要把 /etc/passwd 转成 JSON/etc/passwd的每一行记录一个账户字段之间以冒号:分隔例如 CentOS 7.7 上的一行来自测试夹具 tests/fixtures/centos-7.7/passwd.outroot:x:0:0:root:/root:/bin/bash逐字段拆分后含义如下字段含义示例值username登录用户名rootpassword密码占位真实哈希存于/etc/shadow通常为x或*xuid用户 ID整数0gid主组 ID整数0comment账户备注 / GECOS 信息可能为空roothome家目录路径/rootshell登录 Shell/bin/bash该文件在不同发行版/系统上的风格差异很大CentOS 以x占位密码、部分行 comment 为空如joeuser:x:1000:1000:joeuser:/home/joeuser:/bin/bash与postfix:x:89:89::/var/spool/postfix:/sbin/nologinmacOS如 tests/fixtures/osx-10.14.6/passwd.out则以*占位、注释带有空格如System Administrator并存在-2这类负 UID。jc 的 passwd 解析器就是要统一处理这些差异输出一致的 JSON 结构。二、CLI 用法一行命令把 /etc/passwd 变成 JSON2.1 基本用法与 jc 的其他解析器一致passwd 解析器通过管道读取输入$ cat /etc/passwd | jc --passwd2.2 美化输出-p添加-ppretty选项可以获得带缩进的 JSON便于阅读$ cat /etc/passwd | jc --passwd -p [ { username: nobody, password: *, uid: -2, gid: -2, comment: Unprivileged User, home: /var/empty, shell: /usr/bin/false }, { username: root, password: *, uid: 0, gid: 0, comment: System Administrator, home: /var/root, shell: /bin/sh }, ... ]这是文档 docs/parsers/passwd.md 中给出的真实输出形态。注意 macOS 上的nobody账户 uid/gid 为-2表明该解析器不仅限于 Linux也覆盖 darwin 平台。2.3 原始模式-r保留字符串类型默认处理模式下uid与gid会被转换为整数而-rraw模式返回未经转换的原始字符串$ cat /etc/passwd | jc --passwd -p -r [ { username: nobody, password: *, uid: -2, gid: -2, comment: Unprivileged User, home: /var/empty, shell: /usr/bin/false }, ... ]对比可见默认模式输出uid: -2raw 模式输出uid: -2。-p与-r可以组合使用-r只影响类型转换不影响格式化。2.4 与 jq 联动直接查询用户转换后即可接入jq做条件查询、字段投影等操作例如列出所有可登录用户Shell 不以nologin/false结尾$ cat /etc/passwd | jc --passwd | jq -r .[] | select(.shell | contains(nologin) | not) | \(.username):\(.uid):\(.home)三、Python 模块用法在脚本中调用 parse()在 Python 中通过 jc 的统一入口jc.parse()调用该解析器传入/etc/passwd的文本内容即可import jc with open(/etc/passwd, r, encodingutf-8) as f: passwd_file_output f.read() result jc.parse(passwd, passwd_file_output) # result 为 List[Dict]例如 result[0][username]返回值为字典列表符合下文 Schema。四、Schema输出数据结构parse()与 CLI 的输出均为 JSON 数组每个元素对应/etc/passwd中的一行键名与类型如下节选自 docs/parsers/passwd.md[ { username: string, password: string, uid: integer, gid: integer, comment: string, home: string, shell: string } ]要点处理模式下uid、gid为integerraw 模式下为string其余五个字段在两种模式下均为 stringcomment 可为空字符串如 CentOS 上的postfix行解析结果为comment: 参见夹具 tests/fixtures/centos-7.7/passwd.json。五、解析器信息与兼容性jc/parsers/passwd.py顶部的info类集中声明了解析器元数据属性值说明version1.4解析器版本description/etc/passwd file parser解析器描述author / author_emailKelly Brazil / kellyjonbrazilgmail.com作者信息compatible[linux, darwin, aix, freebsd]兼容平台tags[file]解析器标签文件类型解析器也就是说该解析器兼容linux、darwinmacOS、aix、freebsd四个平台这与测试夹具覆盖的 centos-7.7、ubuntu-18.04、osx-10.14.6 等系统相对应。jc.parse(passwd, ...)会通过jc.utils.compatibility()jc/utils.py校验当前运行平台若平台不在compatible列表中且未指定quietTrue会向 STDERR 输出警告提示该平台输出不受支持。六、源码级实现剖析解析流程与边界处理parse(data, rawFalse, quietFalse)的实现位于 jc/parsers/passwd.py核心流程如下6.1 前置校验jc.utils.compatibility(__name__, info.compatible, quiet) jc.utils.input_type_check(data)compatibility()按上文所述输出平台兼容性警告quietTrue时静默input_type_check()要求data必须是str否则抛出TypeError参见 jc/utils.py。6.2 清理与逐行拆分cleandata list(filter(None, data.splitlines())) if jc.utils.has_data(data): for entry in cleandata: if entry.startswith(#): continue fields entry.split(:)三个值得注意的边界处理空行剔除filter(None, data.splitlines())去掉所有空白行注释跳过以#开头的行被直接continue跳过——macOS 的/etc/passwd头部带有大段#注释见 tests/fixtures/osx-10.14.6/passwd.out 前 10 行这一处理保证注释不会污染输出空输入保护has_data()检查输入是否含非空白字符空输入时直接返回空列表[]。6.3 字段映射按位置拆分后七列分别映射到固定键名output_line[username] fields[0] output_line[password] fields[1] output_line[uid] fields[2] output_line[gid] fields[3] output_line[comment] fields[4] output_line[home] fields[5] output_line[shell] fields[6]6.4 类型转换_processint_list {uid, gid} for entry in proc_data: for key in entry: if key in int_list: entry[key] jc.utils.convert_to_int(entry[key])处理模式下仅uid、gid两个键参与整数转换。jc.utils.convert_to_int()jc/utils.py会先剥离字符串中的非数字字符保留-与.因此 macOS 的-2能正确转为整数-2。若转换失败值无法解析为数字返回None。6.5 raw 与处理模式的分流if raw: return raw_output else: return _process(raw_output)rawTrue直接返回字符串版本否则经过_process()类型转换后返回。这与 CLI 的-r选项一一对应。七、测试验证多平台夹具与空输入仓库为 passwd 解析器提供了完整的单元测试 tests/test_passwd.py覆盖空输入jc.parsers.passwd.parse(, quietTrue)断言结果为[]CentOS 7.7输入 tests/fixtures/centos-7.7/passwd.out对照 tests/fixtures/centos-7.7/passwd.jsonUbuntu 18.04同样有配套的.out/.json夹具macOS 10.14.6输入为带大量#注释与负 UID 的 tests/fixtures/osx-10.14.6/passwd.out对照 tests/fixtures/osx-10.14.6/passwd.json。这些夹具直接印证了本文前述的注释跳过、负整数转换、空 comment 等边界行为。需要注意的是/etc/passwd中的口令字段在现代系统上仅为占位符x或*真实密码哈希存放于需要特权的/etc/shadow中因此该解析器并不涉及任何敏感信息读取。八、实战小结jc --passwd把原本需要awk -F:手工拆列的/etc/passwd变成了一等公民的 JSON 数据结构适用场景包括用jq快速统计各 Shell 的用户分布、查找 UID 为 0 的账户在 Python 自动化脚本中通过jc.parse(passwd, ...)直接获得字典列表免去手写文本解析跨平台审计脚本同一份解析逻辑在 Linux 与 macOS 上输出结构一致便于统一处理。原始模式-r适合需要保留原始字符串语义如处理超大 UID 或特殊格式的场景默认处理模式则更适合数值运算与比较。想进一步了解 jc 的整体用法与其余解析器可查阅仓库根目录的 README.md 与 docs/readme.md。赞分享开发工具【免费下载链接】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 的 group 解析器将 /etc/group 用户组文件转换为 JSON 的完整实战指南jc 的 group 解析器将 /etc/group 用户组文件转换为 JSON 的完整实战指南 本指南深入讲解 jc 项目内置的 group 解析器文档位开发工具一个下午跑通抖音无水印下载工具从 0 到批量下载的实操记录一个下午跑通抖音无水印下载工具从 0 到批量下载的实操记录 这篇文章记录我用 douyin downloader 完成一次抖音无水印下载的全过程装依赖、配开发工具jc 解析 certbot 命令输出将证书与账户信息转换为 JSON 的完整指南jc 解析 certbot 命令输出将证书与账户信息转换为 JSON 的完整指南 certbot Lets Encrypt 客户端的输出是面向人类阅读的开发工具上一篇如何用Tsuru PaaS平台实现企业级多云架构应用部署完整指南下一篇Taskcafe完整指南10个技巧掌握开源看板任务管理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表