Bash执行mongo eval插入数据时加密字段为空问题排查
问题根因
dob字段为空的核心原因是Shell语法使用错误,你被终端输出的假象误导了,加密值从来没有被存入ENCRYPT_VAL变量:
- 你写的加密行
ENCRYPT_VAL="$f5" | openssl aes-256-cbc -a -pbkdf2 -salt -pass pass:{*****}存在两处逻辑错误:- 管道符
|的作用是将左侧命令的标准输出传递给右侧命令作为输入,但变量赋值是Shell内置操作,本身不会产生任何标准输出,openssl根本拿不到$f5的原始值 - 管道两侧的命令默认会在独立的子Shell中运行,就算左侧执行了赋值操作,也不会修改当前父Shell里的
ENCRYPT_VAL变量,加密结果根本不会被变量捕获
- 管道符
- 终端打印密文是假象:openssl的加密结果没有被变量接收,直接输出到了终端,刚好跟在
echo "Female Encrypted value: $ENCRYPT_VAL"的输出后面。因为此时ENCRYPT_VAL是空值,echo打印完提示文字就直接换行,openssl输出的密文刚好出现在下一行,让你误以为是echo打印的变量内容。 - 最终传给mongo --eval的插入语句里,
dob: '$ENCRYPT_VAL'实际展开后是dob: '',所以插入MongoDB的dob字段自然是空字符串。
修复方案
把错误的加密赋值行替换为命令替换写法,通过echo把$f5的值传给openssl标准输入,再将openssl的输出捕获到变量中,注意加-n参数避免echo携带多余换行符干扰加密结果:
# 替换原来错误的ENCRYPT_VAL赋值行 ENCRYPT_VAL=$(echo -n "$f5" | openssl aes-256-cbc -a -pbkdf2 -salt -pass pass:{替换为你的加密密码})
修复后再运行脚本,会看到加密密文直接跟在"Encrypted value: "提示文字后面,不会再单独换行,此时插入MongoDB的dob字段就会是正确的加密值。
额外提醒
你现在直接拼接字符串生成mongo执行的JS语句存在注入风险,如果CSV字段中包含单引号、特殊JS符号,会直接导致语句执行报错,数据源完全可控的测试场景可以凑合用,正式使用建议改成参数传值的方式编写插入逻辑,避免字符串拼接带来的异常。
内容的提问来源于stack exchange,提问作者CasualCoder67
相关产品推荐
相关产品推荐

