ARTICLE DETAIL

资讯详情

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

jc 的 PostgreSQL 密码文件(.pgpass)解析器:从明文凭据到结构化 JSON

jc 的 PostgreSQL 密码文件(.pgpass)解析器:从明文凭据到结构化 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 项目中的pgpass解析器它专门用于读取 PostgreSQL 的密码文件通常为~/.pgpass或/var/lib/postgresql/.pgpass将其中每一条主机:端口:数据库:用户名:密码记录转换为结构化 JSON 数组。读完本文你将掌握.pgpass文件的格式规范与转义规则、jc --pgpass的 CLI 用法与jc.parse(pgpass, ...)的模块化调用方式、输出 Schema以及该解析器在源码层面的解析原理与边界处理逻辑。一、为什么需要解析 .pgpassPostgreSQL 密码文件的痛点PostgreSQL 客户端在非交互式脚本如定时备份、批量数据同步中需要使用密码自动认证时通常会借助密码文件.pgpass规避交互式密码提示。该文件由 PostgreSQL 官方定义采用冒号分隔的五行结构hostname:port:database:username:password这种纯文本格式存在两个明显痛点机器可读性差它是面向libpq客户端库的行式文本格式无法直接被jq、python等数据处理工具消费字段内可含特殊字符hostname、database等字段允许出现冒号或反斜杠必须借助反斜杠转义规则才能正确区分字段边界手工解析极易出错。jc 的pgpass解析器正是为解决上述痛点而设计把.pgpass文件当作普通文本输入逐行转换为字典列表输出后即可直接管道给jq做过滤、统计或脱敏处理。二、解析器基本信息与兼容性从源码元数据jc/parsers/pgpass.py 中的info类可以确认以下事实版本1.0作者Kelly Brazilkellyjonbrazilgmail.com描述PostgreSQL password file parser标签[file]归属于文件类解析器兼容平台linux、darwin、cygwin、win32、aix、freebsd——即所有主流 Unix 系平台与 Windows/Cygwin 环境均可运行注册方式该解析器已被注册进 jc 的解析器列表中见 jc/lib.py 的pgpass条目因此可通过统一入口jc.parse()调度三、CLI 用法一行命令把 .pgpass 变成 JSON官方文档给出的 CLI 用法如下$ cat /var/lib/postgresql/.pgpass | jc --pgpass以/var/lib/postgresql/.pgpass为例--pgpass是 jc 为该解析器分配的 CLI 选项在 README.md 的解析器列表中以--pgpass登记。执行后输出为 JSON 数组每个元素对应文件中的一条记录。配合-ppretty参数可获得带缩进的可读输出$ cat /var/lib/postgresql/.pgpass | jc --pgpass -p [ { hostname: dbserver, port: *, database: db1, username: dbuser, password: pwd123 }, { hostname: dbserver2, port: 8888, database: inventory, username: joe:user, password: abc123 }, ... ]安全提示.pgpass文件包含明文口令解析结果同样属于敏感信息。在自动化脚本中应避免将输出写入日志或非授权可读的位置。输出 Schema解析结果是一个由字典组成的列表每个字典固定包含 5 个键且所有字段在输出中均为字符串类型键名类型含义hostnamestring主机名支持*通配符如*匹配所有主机portstring端口号支持*通配符databasestring数据库名支持*通配符usernamestring用户名支持*通配符passwordstring明文密码[ { hostname: string, port: string, database: string, username: string, password: string } ]注意端口在源文件中通常写作数字但解析器一律以字符串形式输出方便与*通配符保持类型一致。四、模块化用法在 Python 代码中调用除命令行外pgpass解析器同样暴露为 Python 模块接口官方文档给出的用法是import jc result jc.parse(pgpass, postgres_password_file)其中postgres_password_file是包含.pgpass文件全部文本内容的字符串。jc.parse()会根据第一个参数pgpass路由到对应解析器注册于 jc/lib.py返回List[Dict]类型的结果。更底层的调用方式则是直接导入解析器模块from jc.parsers.pgpass import parse with open(/var/lib/postgresql/.pgpass, r, encodingutf-8) as f: result parse(f.read())parse() 函数签名与参数def parse(data: str, raw: bool False, quiet: bool False) - List[Dict[str, Any]]data待解析的文本数据字符串raw布尔值为True时返回未经过后处理的原始结构化数据quiet布尔值为True时抑制警告信息输出返回值为字典列表rawTrue时返回原始结构否则返回符合 Schema 的最终结构。从实现看parse()首先调用jc.utils.compatibility()做平台兼容性检查、jc.utils.input_type_check()校验输入类型见 jc/utils.py再通过jc.utils.has_data()判断输入是否为空见 jc/utils.py。当输入为空字符串时直接返回空列表[]——这一点已被测试用例test_pgpass_nodata显式验证parse(, quietTrue)的期望结果为[]见 tests/test_pgpass.py。五、解析原理如何正确处理注释与转义pgpass解析器的核心逻辑集中在 jc/parsers/pgpass.py主要分为三步。1. 逐行过滤for line in filter(None, data.splitlines()): # ignore comment lines if line.strip().startswith(#): continue空行被filter(None, ...)直接排除以#开头的行被视为注释行允许行首有前导空白先strip()再判断直接跳过。2. 转义字符处理# convert escaped characters (\ and :) line line.replace(:, \u2063) line line.replace(\\\\, \\) line line.replace(\\\u2063, :)这是整个解析器最精妙的部分。.pgpass规范规定字段中的字面冒号需用\:转义字段中的字面反斜杠需用\\转义。若直接按冒号split将无法区分分隔符冒号与被转义的冒号。因此解析器采用临时占位符策略先把所有冒号替换为不可见占位符\u2063Unicode 零宽字符不会出现在正常密码中再把转义的反斜杠对\\还原为单个\最后把反斜杠 占位符即原\:还原为字面冒号:。这样既保留了转义语义又保证了后续split的准确性。3. 按字段拆分hostname, port, database, username, password line.split(\u2063)此时行内剩下的占位符恰好是真正的字段分隔符解包为 5 个字段后逐条构造成字典并追加到raw_output。4. 后处理return raw_output if raw else _process(raw_output)_process()见 jc/parsers/pgpass.py在当前版本中直接原样返回数据不做类型转换或字段清洗——因为 5 个字段本就全部按字符串输出Schema 无需二次加工。这也是raw参数在当前版本中不改变输出结果的原因。六、测试夹具验证真实输入与期望输出仓库测试夹具 tests/fixtures/generic/pgpass.txt 提供了一段极具代表性的真实输入覆盖了各类边界情况dbserver:443:db1:dbuser:pwd123 dbserver2:8888:inventory:joeuser:abc123 ax1234:1234:tables:dbadmin:password1 dbserver3:8888:inventory:joeuser:abc123 # comment localhost:5555:table\\1:user\:w\:colon:password123 # anther comment hostname:*:database:username:password对应的期望输出 tests/fixtures/generic/pgpass.json 为[{hostname:dbserver,port:443,database:db1,username:dbuser,password:pwd123},{hostname:dbserver2,port:8888,database:inventory,username:joeuser,password:abc123},{hostname:ax1234,port:1234,database:tables,username:dbadmin,password:password1},{hostname:dbserver3,port:8888,database:inventory,username:joeuser,password:abc123},{hostname:localhost,port:5555,database:table\\1,username:user:w:colon,password:password123},{hostname:hostname,port:*,database:database,username:username,password:password}]该夹具精心设计了以下边界场景逐一验证了解析器的健壮性输入特征预期行为空行第 4 行被过滤不产生输出元素# comment注释行被跳过行首带缩进的注释# anther comment先strip()再判断同样被跳过table\\1转义反斜杠还原为字面table\1user\:w\:colon转义冒号还原为字面user:w:colon且不与字段分隔符混淆port字段为*通配符按字符串原样输出*单元测试tests/test_pgpass.py将解析器输出与上述 JSON 夹具做全等比较assertEqual保证任何对解析逻辑的改动都必须通过这组边界用例的回归验证。七、与相邻文件解析器的协同自动化脚本示例由于pgpass是文件类解析器tags [file]它常与其他文件解析器配合出现在运维脚本中。例如将.pgpass的 JSON 输出交给jq做进一步筛选$ cat /var/lib/postgresql/.pgpass | jc --pgpass | jq .[] | select(.port 8888) | .hostname dbserver2 dbserver3或者在 Python 脚本中解析后将其注入到 PostgreSQL 自动化流程中import jc with open(/var/lib/postgresql/.pgpass, r, encodingutf-8) as f: entries jc.parse(pgpass, f.read()) # entries 形如 [{hostname: ..., port: ..., database: ..., username: ..., password: ...}, ...] for entry in entries: if entry[database] ! *: print(ftarget db: {entry[hostname]}:{entry[port]}/{entry[database]})八、限制与注意事项明文输出解析器不加密、不脱敏password字段原样输出请自行控制输出流转无类型转换所有字段均为字符串port不会转换为整数后续处理如排序、比较时需自行转换严格五行格式若某行字段数不是 5例如缺失字段line.split()解包会失败解析器对这类畸形行没有容错分支输入应为合法.pgpass文件raw参数语义当前版本_process()为恒等处理rawTrue与默认输出一致该参数主要为与其他解析器保持接口统一而保留。九、总结jc --pgpass用一条管道命令即可将 PostgreSQL 密码文件转换为结构化 JSON其源码实现jc/parsers/pgpass.py通过占位符替换技巧正确处理了.pgpass的转义规则并通过 tests/fixtures/generic/pgpass.txt 与 tests/test_pgpass.py 组成的测试夹具保证了注释行、空行、转义冒号、转义反斜杠与通配符等边界场景的解析正确性。无论是命令行快速查看还是通过jc.parse(pgpass, ...)集成进 Python 自动化流程该解析器都能让原本难以机器消费的明文凭据文件立刻变得可查询、可过滤、可审计。赞分享开发工具【免费下载链接】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 proc_filesystems 解析器将 Linux /proc/filesystems 文件结构化解析为 JSONjc proc_filesystems 解析器将 Linux /proc/filesystems 文件结构化解析为 JSON 本文围绕 jc 的 proc_f开发工具jc 解析 tune2fs -l 输出从 ext 文件系统元数据到结构化 JSON 的完整指南jc 解析 tune2fs l 输出从 ext 文件系统元数据到结构化 JSON 的完整指南 本文围绕 jc 项目内置的 tune2fs 解析器展开系统讲解开发工具pgpassfile 源码解析Go 语言解析 PostgreSQL .pgpass 密码文件的完整实现指南pgpassfile 源码解析Go 语言解析 PostgreSQL .pgpass 密码文件的完整实现指南 导读 pgpassfile 是 github.co人工智能AI AgentAgent 沙箱云原生容器运行时零信任上一篇终极图像预处理指南9种技术大幅提升Python Tesseract OCR识别率 下一篇OCRmyPDF与增强现实将OCR文本叠加到真实世界视图的创新指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表