使用Curl将日志文件转base64上传GitHub遇参数过长、JSON解析错误求助
问题原因与解决方案
现有代码的3个核心错误
- 生成base64文件的命令逻辑错误:你写的
base64_logs=$( base64 logs.tar.gz | tr -d \\ ) > base64_logs.txt中,$()的输出全部赋值给了base64_logs变量,没有内容输出到标准输出,最终得到的base64_logs.txt是空文件;同时你用tr -d \\删除的是反斜杠,原本应该删除base64编码自动生成的换行符,逻辑完全不符合要求。 - curl的
-d参数的@文件名语法仅在-d的参数值完全以@开头时才会生效,你把@base64_logs.txt放在JSON字符串内部,curl不会解析这个标记,只会把它当成普通字符串传递,导致JSON格式完全不符合要求。 - 即使curl支持JSON内部解析
@标记,你构造的JSON里content的取值也缺少双引号包裹,同样会触发JSON解析错误。
正确实现代码
推荐用jq工具构造合法JSON,全程不需要处理转义、也不会出现参数过长问题:
# 打包日志文件 tar -czvf logs.tar.gz a.log b.log # 生成无换行的base64编码,直接写入临时文件(macOS环境请把-w0换成-b0) base64 -w0 logs.tar.gz > base64_logs.txt # 用jq构造合法JSON,通过标准输入传递给curl content_response=$(jq -n --rawfile content base64_logs.txt '{"message": "Log files", "content": $content}' | curl \ -X PUT \ -u :"$GIT_TOKEN" \ -H "Accept: application/vnd.github.v3+json" \ "$content_url" \ -d @-)
代码说明
--rawfile参数会把指定文件的内容完整读取为字符串,自动处理所有转义逻辑,保证JSON格式合法- curl的
-d @-代表从标准输入读取请求体,完全避开了命令行参数长度限制
内容的提问来源于stack exchange,提问作者disp_name
相关产品推荐
相关产品推荐

