如何修改脚本使jq读取JSON内环境变量时命令替换可正常执行
问题原因
- 你当前脚本的问题有两点:
- jq调用逻辑冲突:你同时用管道给jq传了
$values的输出,又给jq传了文件参数$1,jq会优先读取文件内容,管道输入会被直接忽略,需要先统一数据源逻辑。 - jq输出的
key=value是普通字符串,shell默认不会解析字符串内部的$()命令替换、变量展开等语法,只有手动执行语句或者用eval触发shell解析时,这些语法才会生效。
- jq调用逻辑冲突:你同时用管道给jq传了
修复方案
安全提示
该方案依赖
eval执行动态内容,仅适用于你完全信任JSON文件内容的场景,如果JSON可能被第三方篡改,会存在任意命令执行的安全风险。
修改后的脚本如下:
#!/bin/bash # 校验传入的JSON文件是否存在 if [ ! -f "$1" ]; then echo "请传入合法的JSON文件路径" exit 1 fi IFS=$'\n' # 移除多余的管道输入,直接从指定JSON文件读取内容 for s in $(jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' "$1"); do # 用eval触发shell解析字符串内的命令替换逻辑 eval "export $s" # 输出解析后的实际值做验证 eval echo "$s" done unset IFS
效果验证
执行脚本后执行echo $PASSPHRASE即可看到输出为/home/x/secret的文件内容,和手动执行export语句的效果完全一致。
内容的提问来源于stack exchange,提问作者user2625247
相关产品推荐
相关产品推荐

