使用Bash嵌入Python创建AWS Secret时遇键值转换错误求助
问题根源分析
你的错误核心是长文本(私钥、CSR)中的特殊字符(换行、引号等)在Bash插值过程中破坏了JSON语法结构,导致AWS Secrets Manager收到的不是合法的JSON对象,无法解析为键值对。短字符串能正常工作是因为它们不含这类特殊字符,不会破坏JSON格式。
解决方案
一、修复AWS CLI调用问题
不要直接在Bash中拼接JSON字符串,改用jq工具自动处理特殊字符转义,生成合法的JSON:
export keyfile="path/to/your/keyfile" export csrfile="path/to/your/csrfile" export configfile="${key_algorithm}-$line.cfn" # 用jq生成合法JSON,自动转义换行、引号等特殊字符 aws secretsmanager create-secret --name marwahas51 \ --description "Values for this environments wildcard certifcate in ACM" \ --secret-string "$(jq -n \ --arg prvpem "$(<"$keyfile")" \ --arg csr "$(<"$csrfile")" \ --arg config "$(<"$configfile")" \ '{Privatekey: $prvpem, csr: $csr, config: $config}')" \ --kms-key-id "alias/SecretsMgr" \ --tags "Key=Environment,Value=Dev"
关键说明:
$(<"$file"):读取文件原始内容(保留换行符)jq:自动处理所有特殊字符的转义,确保输出的JSON语法完全合法
二、修复Bash嵌入Python的问题
避免让Bash直接将变量插值到Python脚本中,改用命令行参数传递文件路径,让Python自行读取内容,彻底规避Bash的字符转义问题:
cat << EOF > pyscript.py #!/usr/bin/python3 -tt import json import boto3 import sys # 从命令行参数获取文件路径 csr_file, config_file, prvpem_file = sys.argv[1], sys.argv[2], sys.argv[3] # 读取文件内容的工具函数 def read_file(path): with open(path, 'r') as f: return f.read() # 构造合法的字典对象 key_info = { "csr": read_file(csr_file), "config": read_file(config_file), "PrivateKey": read_file(prvpem_file) } client = boto3.client('secretsmanager') response = client.create_secret( Name='marw', KmsKeyId='alias/SecretsMgr', SecretString=json.dumps(key_info) ) print(response) EOF chmod 770 pyscript.py # 传递文件路径作为参数执行脚本 ./pyscript.py "$csrfile" "${key_algorithm}-$line.cfn" "$keyfile" printf "This is BASH again\n"
备选方案:通过环境变量传递内容
如果必须传递内容而非文件路径,用printf保留原始换行后导出为环境变量:
# 导出环境变量,保留原始换行 export CSR_CONTENT="$(printf "%s" "$(<"$csrfile")")" export CONFIG_CONTENT="$(printf "%s" "$(<"${key_algorithm}-$line.cfn")")" export PRVPEM_CONTENT="$(printf "%s" "$(<"$keyfile")")" cat << EOF > pyscript.py #!/usr/bin/python3 -tt import json import boto3 import os key_info = { "csr": os.environ['CSR_CONTENT'], "config": os.environ['CONFIG_CONTENT'], "PrivateKey": os.environ['PRVPEM_CONTENT'] } client = boto3.client('secretsmanager') response = client.create_secret( Name='marw', KmsKeyId='alias/SecretsMgr', SecretString=json.dumps(key_info) ) print(response) EOF chmod 770 pyscript.py ./pyscript.py printf "This is BASH again\n"
内容的提问来源于stack exchange,提问作者user3561229
相关产品推荐
相关产品推荐

