开发工具【免费下载链接】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项目中的gpg解析器它能把 GnuPG 工具链gpg --with-colons生成的机器可读文本输出解析为结构化的 JSON、YAML 或 Python 字典从而让密钥信息可以无缝接入jq等管道工具简化自动化脚本。读完本文你将掌握jc --gpg与jc.parse(gpg, ...)两种调用方式、完整输出 Schema含pkd/tfs/tru/skp/cfg五种特殊记录类型、字段语义以及该解析器的源码级实现原理与测试验证方式。gpg 解析器是什么jc是一款将流行命令行工具输出、文件类型与常见字符串转换为 JSON/YAML/字典的 CLI 工具和 Python 库。gpg解析器是其 200 解析器中的一员对应源码为 jc/parsers/gpg.py解析对象是gpg --with-colons命令输出的冒号分隔colon-separated记录流。gpg --with-colons是 GnuPG 提供的一种稳定、机器可读的输出格式每一行代表一条记录字段之间以冒号:分隔。该格式专为程序消费而设计字段定义源自 GnuPG 官方文档doc/DETAILS。jc在此基础上将每一行映射为一个 JSON 对象并把所有空字段统一转换为null使输出更接近常规 JSON 数据结构。解析器的元数据定义在源码 jc/parsers/gpg.py 的info类中版本 1.0作者 Kelly Brazil兼容平台为linux并声明了魔法命令magic commandgpg --with-colons这意味着 jc 可以通过识别命令特征自动选择该解析器。两种调用方式CLI 用法将gpg命令输出通过管道传给 jc或直接让 jc 代为执行命令$ gpg --with-colons --show-keys file.gpg | jc --gpg或$ jc gpg --with-colons --show-keys file.gpg两种方式等价前者解析已有输出后者由 jc 调用命令并解析。也可以配合--show-keys、--list-keys等子命令使用例如列出某个密钥环中所有密钥$ gpg --with-colons --list-keys --with-fingerprint wkgnupg.org | jc --gpg -p其中-p--pretty让 JSON 输出带缩进更易阅读。加上-y--yaml则可输出 YAML 格式。Python 模块用法在脚本中导入 jc调用parse方法即可import jc result jc.parse(gpg, gpg_command_output)gpg_command_output是gpg --with-colons的原始文本字符串返回值为字典列表。输出 Schema 与字段说明解析结果是一个对象数组每个对象对应输入中的一行记录。完整 Schema 如下字段定义参考 GnuPG 官方文档doc/DETAILS[ { type: string, validity: string, key_length: string, pub_key_alg: string, key_id: string, creation_date: string, expiration_date: string, certsn_uidhash_trustinfo: string, owner_trust: string, user_id: string, signature_class: string, key_capabilities: string, cert_fingerprint_other: string, flag: string, token_sn: string, hash_alg: string, curve_name: string, compliance_flags: string, last_update_date: string, origin: string, comment: string, index: string, bits: string, value: string, version: string, signature_count: string, encryption_count: string, policy: string, signature_first_seen: string, signature_most_recent_seen: string, encryption_first_done: string, encryption_most_recent_done: string, staleness_reason: string, trust_model: string, trust_db_created: string, trust_db_expires: string, marginally_trusted_users: string, completely_trusted_users: string, cert_chain_max_depth: string, subpacket_number: string, hex_flags: string, subpacket_length: string, subpacket_data: string, pubkey: string, cipher: string, digest: string, compress: string, group: string, members: string, curve_names: string } ]注意数值字段不会被转换为整数统一保留为字符串。原因是 GnuPG 的字段规范存在大量重载overloaded且官方文档暗示未来会继续扩展字段含义强行转整数会导致信息丢失或误读。关键通用字段语义针对常规记录如pub、sub、uid、fpr前 21 个字段含义如下字段含义type记录类型如pub主公钥、sub子密钥、sec/ssb私钥、uid用户 ID、fpr指纹、sig签名、rev/rvs吊销等validity有效性码如f完全有效 fully valid、m边际有效 marginal、r已吊销 revoked等key_length密钥长度比特数pub_key_alg公钥算法编号如 17 DSA、1 RSA、16 Elgamal、20 Elgamal 加密key_id密钥 IDcreation_date创建时间自 Unix 纪元起的秒数expiration_date过期时间秒无过期为 0 或空certsn_uidhash_trustinfo证书序列号 / UID 哈希 / 信任信息owner_trust所有者信任级别user_id用户 ID 字符串如Werner Koch wkgnupg.org或指纹记录中的指纹值signature_class签名类别key_capabilities密钥能力字母串如scESCsign、certify 等小写表示可用、大写表示不可用hash_alg哈希算法编号curve_name椭圆曲线名称现代 GnuPG 密钥compliance_flags合规标志如23表示 de-vs 合规状态last_update_date最后更新日期origin密钥来源标识所有空白字段在输出中统一为null。五种特殊记录类型的字段重映射gpg --with-colons输出除常规密钥记录外还存在pkd、tfs、tru、skp、cfg五种特殊记录它们字段的含义与通用映射不同。解析器在源码 jc/parsers/gpg.py 中对其做了专门处理pkd公共密钥数据[0]pkd:0:1024:B665B1435F4C2FF26ABB:这类记录描述密钥参数如 DSA 的 p/q/g/y 从 0 到 3 依次编号。解析后仅保留三个字段{type: pkd, index: 0, bits: 1024, value: B665B1435F4C2FF26ABB}index参数索引例如 DSA 从 0 到 3p、q、g、ybits参数值的比特数value参数值tfs指纹/签名统计[1]tfs记录tofu 信任模型的签名/加密统计字段含义如下源码注释给出了逐字段说明字段 2tfs 记录版本必须为 1字段 3有效性码字段 4signature_count—— 见过的签名数量字段 5encryption_count—— 完成的加密次数字段 6policy—— 策略字符串字段 7signature_first_seen—— 首次见到签名的时间戳未知为 0字段 8signature_most_recent_seen—— 最近见到签名的时间戳字段 9encryption_first_done—— 首次加密完成时间戳字段 10encryption_most_recent_done—— 最近加密完成时间戳对应输出{type: tfs, version: 1, validity: f, signature_count: 3, encryption_count: 4, policy: 5, signature_first_seen: 6, signature_most_recent_seen: 7, encryption_first_done: 8, encryption_most_recent_done: 9}tru信任库信息[2]tru:o:0:1166697654:1:3:1:5这类记录描述 trustdb 状态映射为{type: tru, staleness_reason: o, trust_model: 0, trust_db_created: 1166697654, trust_db_expires: 1, marginally_trusted_users: 3, completely_trusted_users: 1, cert_chain_max_depth: 5}各字段含义staleness_reason信任库过期的原因trust_model信任模型0 classic 经典模型trust_db_createdtrustdb 创建时间Unix 秒trust_db_expirestrustdb 过期时间Unix 秒marginally_trusted_users引入新密钥签名者所需的边际信任用户数completely_trusted_users引入新密钥签名者所需的完全信任用户数cert_chain_max_depth认证链最大深度skp签名子包[3]skp记录描述签名子包signature subpacket字段含义字段 2subpacket_number—— 子包编号依据 RFC-4880 及后续版本字段 3hex_flags—— 十六进制标志字段 4subpacket_length—— 子包长度字段 5subpacket_data—— 子包数据cfg配置信息[4]cfg记录是 GnuPG 2.1 后出现的配置快照按第二字段细分为七种子格式见源码 jc/parsers/gpg.py 的分支处理记录示例解析结果cfg:version:1.3.5{type: cfg, version: 1.3.5}cfg:pubkey:1;2;3;16;17{type: cfg, pubkey: 1;2;3;16;17}cfg:cipher:2;3;4;7;8;9;10{type: cfg, cipher: 2;3;4;7;8;9;10}cfg:digest:1;2;3;8;9;10{type: cfg, digest: 1;2;3;8;9;10}cfg:compress:0;1;2;3{type: cfg, compress: 0;1;2;3}cfg:group:mynames:patti;joe;0x12345678;paige{type: cfg, group: mynames, members: patti;joe;0x12345678;paige}cfg:curve:ed25519;nistp256;nistp384;nistp521{type: cfg, curve_names: ed25519;nistp256;nistp384;nistp521}其中pubkey、cipher、digest、compress、curve_names的分号分隔列表分别对应 GnuPG 编译时启用的公钥算法、对称加密算法、哈希算法、压缩算法和椭圆曲线group记录则表达一个密钥组名及其成员列表。完整输出示例以gpg --with-colons --show-keys file.gpg的输出为例经jc --gpg -p解析后得到节选[ { type: pub, validity: f, key_length: 1024, pub_key_alg: 17, key_id: 6C7EE1B8621CC013, creation_date: 899817715, expiration_date: 1055898235, certsn_uidhash_trustinfo: null, owner_trust: m, user_id: null, signature_class: null, key_capabilities: scESC, cert_fingerprint_other: null, flag: null, token_sn: null, hash_alg: null, curve_name: null, compliance_flags: null, last_update_date: null, origin: null, comment: null }, ... ]parse 函数 APIgpg解析器对外暴露的唯一入口是parse函数定义于 jc/parsers/gpg.pydef parse(data: str, raw: bool False, quiet: bool False) - List[Dict]参数说明参数类型说明datastring待解析的gpg --with-colons文本rawboolean为True时返回未经后处理的原始结构化输出quietboolean为True时抑制警告信息返回值为字典列表rawFalse时返回按 Schema 处理后的结构化数据rawTrue时返回未处理数据。源码级实现原理parse的实现非常简洁核心逻辑在 jc/parsers/gpg.py前置校验调用jc.utils.compatibility检查运行平台是否在info.compatible即linux范围内并调用jc.utils.input_type_check校验输入类型空数据处理通过jc.utils.has_data(data)判断输入是否为空为空则返回[]逐行拆分for line in filter(None, data.splitlines())按行遍历并过滤空行冒号切分values line.split(:)将每行按冒号拆分为字段列表安全取字段辅助函数_list_get(my_list, index, default_valNone)jc/parsers/gpg.py在索引越界时返回None且会把空字符串转换为None这正是所有空值转为 null的实现来源类型分流先按通用映射构建temp_obj再根据type字段对pkd/tfs/tru/skp/cfg五种特殊记录重新映射字段其中cfg又按第二字段细分七种格式其余记录类型直接使用通用映射返回rawTrue时直接返回原始列表否则调用_process当前版本_process为原样返回见 jc/parsers/gpg.py后返回。值得注意的是由于每条gpg --with-colons输出行本身就是一条独立记录该解析器没有使用状态机或上下文跟踪——每条记录独立解析无跨行关联逻辑因此实现极其轻量、性能好且不易出错。测试与验证仓库为该解析器提供了完整的单元测试与夹具测试文件 tests/test_gpg.py包含空输入测试parse(, quietTrue)应返回[]和真实输出解析测试——后者使用夹具gpg.out对应命令为gpg --with-colons --list-keys --with-fingerprint --with-fingerprint wkgnupg.org断言解析结果与期望 JSON 完全一致输入夹具 tests/fixtures/generic/gpg.out包含pub/fpr/uid/sub常规记录以及pkd、tfs、tru、skp和全部七种cfg子格式覆盖了解析器的所有分支路径期望输出 tests/fixtures/generic/gpg.json与输入一一对应的结构化 JSON。从夹具可见常规记录如pub:f:1024:17:6C7EE1B8621CC013:899817715:1055898235::m:::scESC:会被映射为完整 21 字段对象而fpr记录则把指纹值放在user_id字段与 GnuPG 官方格式一致pkd等特殊记录按上文所述重映射为精简字段。常见使用场景与注意事项密钥审计与监控定期运行gpg --with-colons --list-keys并交由jc --gpg解析再用jq筛选validity r已吊销或即将过期的密钥可构建轻量级密钥生命周期监控脚本兼容性限制解析器声明兼容平台为linux见info.compatible在其他平台使用时会发出兼容性警告可加-q或quietTrue抑制数值处理所有数值字段保持字符串若脚本需要数值比较请自行int()转换同时注意creation_date/expiration_date等时间字段是 Unix 秒时间戳多记录输出解析结果始终是数组即使只有一条记录遍历时无需做类型判断。该解析器文档全文见 docs/parsers/gpg.md解析器源码见 jc/parsers/gpg.py更多 jc 解析器与库用法可参考 docs/readme.md 与 docs/lib.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 解析器实战指南用 jc --history 将 shell history 命令输出转换为 JSONjc 解析器实战指南用 jc history 将 shell history 命令输出转换为 JSON 本指南以 jc 开源项目中的 history 解析器文开发工具jc 解析器实战将 debconf-show 包配置输出转换为 JSONjc 解析器实战将 debconf show 包配置输出转换为 JSON 本指南围绕 jc 项目的 debconf show 解析器展开讲解如何把 Debi开发工具jc 解析器实战将 apt-cache show 输出转换为 JSON 的 apt_cache_show 解析器jc 解析器实战将 apt cache show 输出转换为 JSON 的 apt_cache_show 解析器 apt cache show 是 Debia开发工具上一篇deno-lambda配置秘籍环境变量与权限管理完全解析下一篇Moby容器编排配置模板与变量注入创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
