读取CVE列表文件调用curl获取Severity返回空值,求排查解决
问题解决:CVE接口调用返回空值的排查与修复
可能的原因及对应解决方案
1. 输入文件存在行尾特殊字符(如Windows换行符\r)
如果你的cves.csv是Windows格式保存的,每行末尾会带有\r字符,导致拼接后的URL包含无效字符,接口返回空。
修复方法:读取行时清除所有空白字符(包括换行、回车、空格):
while read -r line; do # 清除行首行尾的所有空白字符(包括\r、空格等) cve=$(echo "$line" | xargs) echo "处理CVE:$cve" # 后续操作使用$cve而非$line done < "$filename"
2. curl静默模式隐藏了错误信息
你用了-s参数,curl会屏蔽错误输出,导致你看不到连接失败、404等问题。
修复方法:临时去掉-s,或者加上-v查看详细请求日志:
# 临时调试用,查看请求和响应详情 curl -v "https://cve.circl.lu/api/cve/$cve" # 或者保留静默但显示错误 curl -s -S "https://cve.circl.lu/api/cve/$cve"
3. API接口需要请求头(如User-Agent)
部分API会拦截无标识的请求,添加User-Agent可以解决:
cve_result=$(curl -s -A "Mozilla/5.0" "https://cve.circl.lu/api/cve/$cve")
4. 完整可运行脚本(含Severity提取与CSV输出)
结合以上修复,最终脚本可以解析JSON提取Severity,并输出到目标CSV:
#!/bin/bash filename="cves.csv" output="cve_severity.csv" # 写入CSV表头 echo "cve-id,cve-severity" > "$output" while read -r line; do # 清理CVE ID的多余字符 cve=$(echo "$line" | xargs) # 跳过空行 [ -z "$cve" ] && continue echo "正在处理:$cve" # 调用API,添加User-Agent,保留错误输出 cve_result=$(curl -s -S -A "Bash CVE Scraper" "https://cve.circl.lu/api/cve/$cve") # 用jq提取severity(需要先安装jq:sudo apt install jq / brew install jq) severity=$(echo "$cve_result" | jq -r '.cvss[]?.severity // "Unknown"') # 写入结果到CSV echo "$cve,$severity" >> "$output" # 避免请求过快触发速率限制 sleep 1 done < "$filename" echo "处理完成,结果已保存到$output"
注意事项
- 确保安装了
jq工具,用于解析JSON响应。如果没有安装,根据你的系统用包管理器安装。 - 添加
sleep 1是为了避免频繁请求触发API的速率限制,防止被临时封禁。 - 如果部分CVE返回"Unknown",说明该CVE在接口中没有Severity数据。
内容的提问来源于stack exchange,提问作者liltitus27
相关产品推荐
相关产品推荐

