You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写Bash脚本生成近1月到期证书的JSON列表文件

生成近1个月到期证书的JSON列表脚本方案

需求概述

编写脚本抓取近1个月内到期的证书,输出如下结构的JSON文件:

{
  "data": [
    {
      "expiration_date": "证书过期日期",
      "serial_number": "证书序列号"
    }
  ]
}

现有脚本问题

  1. 证书列表处理依赖grep/tr,易出错,不如直接用jq提取
  2. 循环中把证书数据拼接成字符串,无法直接转换为标准JSON对象
  3. 未实现“近1个月到期”的过滤逻辑
  4. 最终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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:53:27