从Vaulwarden获取JSON密钥后设置环境变量遇解析错误求助
解决Vaulwarden密钥转环境变量的单引号注入问题
问题核心
从Vaulwarden实例通过UUID获取JSON编码的密钥后,要生成uuid_USERNAME=username、uuid_FIELD_fieldname=fieldvalue格式的环境变量,但echo输出时会注入单引号,导致遍历字段的for循环执行jq解析失败。
解决思路
跳过可能引入单引号的echo传递步骤,直接通过管道或变量传递原始JSON内容,让jq能解析合法的JSON格式。
具体修复方案
1. 调整循环逻辑,直接处理原始JSON条目
假设你原本的错误脚本类似这样:
# 错误示例:echo传递entry导致注入单引号 for entry in $(bw list items --search "uuid"); do echo $entry | jq -r '.id' # 此处echo会给entry套单引号,触发jq解析错误 done
改成以下正确写法,避免shell分词和引号注入:
# 正确写法:用jq流式输出拆分JSON数组,直接读取原始条目 bw list items --search "uuid" | jq -c '.[]' | while read -r entry; do # 生成USERNAME类型环境变量 uuid=$(echo "$entry" | jq -r '.id') username=$(echo "$entry" | jq -r '.login.username // ""') export "${uuid}_USERNAME"="$username" # 遍历自定义字段,生成FIELD类型环境变量 echo "$entry" | jq -r '.fields[] | [.name, .value] | @tsv' | while read -r field_name field_value; do # 可选:将字段名转大写,避免大小写混乱 export "${uuid}_FIELD_${field_name^^}"="$field_value" done done
2. 关键修复点说明
- 用
jq -c '.[]'把JSON数组拆成单行的单个对象,避免shell对JSON内容进行分词 - 用
while read -r entry读取原始JSON内容,不要用for循环遍历命令输出(会触发shell自动添加单引号) - 处理自定义字段时,用
@tsv让jq输出制表符分隔的字段名和值,避免空格、特殊字符导致的内容拆分问题
验证方法
执行脚本后,通过以下命令检查环境变量是否正确生成:
printenv | grep "<你的UUID前缀>" # 预期输出示例: # abc123_USERNAME=johndoe # abc123_FIELD_APIKEY=xyz789
错误原因复盘
使用echo <<< $entry或echo $entry时,shell会自动转义JSON中的双引号、空格等特殊字符,甚至给整个内容套上单引号,导致jq接收到的不是合法JSON格式,最终抛出解析错误。
内容的提问来源于stack exchange,提问作者izphi78
相关产品推荐
相关产品推荐

