You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash执行mongo eval插入数据时加密字段为空问题排查

问题根因

dob字段为空的核心原因是Shell语法使用错误,你被终端输出的假象误导了,加密值从来没有被存入ENCRYPT_VAL变量:

  • 你写的加密行ENCRYPT_VAL="$f5" | openssl aes-256-cbc -a -pbkdf2 -salt -pass pass:{*****}存在两处逻辑错误:
    1. 管道符|的作用是将左侧命令的标准输出传递给右侧命令作为输入,但变量赋值是Shell内置操作,本身不会产生任何标准输出,openssl根本拿不到$f5的原始值
    2. 管道两侧的命令默认会在独立的子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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:24:25