如何编写Bash脚本生成近1月到期证书的JSON列表文件
生成近1个月到期证书的JSON列表脚本方案
需求概述
编写脚本抓取近1个月内到期的证书,输出如下结构的JSON文件:
{ "data": [ { "expiration_date": "证书过期日期", "serial_number": "证书序列号" } ] }
现有脚本问题
- 证书列表处理依赖
grep/tr,易出错,不如直接用jq提取 - 循环中把证书数据拼接成字符串,无法直接转换为标准JSON对象
- 未实现“近1个月到期”的过滤逻辑
- 最终
jq处理无法正确构建嵌套JSON结构
修正后的脚本
#!/bin/bash # 计算1个月后的时间戳(秒级),用于后续过期判断 one_month_later=$(date -d "+1 month" +%s) # 存储符合条件的证书JSON对象 cert_entries=() # 获取证书名称列表,用jq直接提取数组元素 curl -s --header "..." --request LIST https://some_uri | jq -r '.data.keys[]' | while read -r cert_name; do # 获取单张证书的详情JSON cert_json=$(curl -s --header "..." --request GET "https://some_uri/$cert_name") # 提取过期日期并转为时间戳,提取序列号 expire_date=$(echo "$cert_json" | jq -r '.data.data.expiration_date') expire_ts=$(echo "$expire_date" | date -d "$expire_date" +%s 2>/dev/null) serial_num=$(echo "$cert_json" | jq -r '.data.data.serial_number') # 跳过日期解析失败的证书 [[ -z "$expire_ts" ]] && continue # 判断是否在1个月内到期 if [[ "$expire_ts" -le "$one_month_later" ]]; then # 构建目标格式的JSON对象,加入数组 cert_entries+=("$(jq -n --arg exp "$expire_date" --arg sn "$serial_num" \ '{expiration_date: $exp, serial_number: $sn}')") fi done # 将所有证书对象组合成最终JSON结构并写入文件 printf '%s\n' "${cert_entries[@]}" | jq -s '{data: .}' > expiring_certs.json
关键说明
- 证书列表提取:
jq -r '.data.keys[]'直接输出每个证书名称,避免文本处理的不稳定问题 - 日期过滤:将证书过期日期转为时间戳,与1个月后的时间戳对比,精准筛选到期证书
- JSON构建:用
jq -n结合参数生成标准JSON对象,确保格式合法 - 最终组合:
jq -s '{data: .}'将所有对象数组包裹到data字段下,直接写入文件
内容的提问来源于stack exchange,提问作者ElRamos
相关产品推荐
相关产品推荐

