Bash变量在Mongo eval命令中插入空数据



我有一个脚本,从CSV插入数据到Mongo,但我必须在插入之前加密其中一列。

#!/bin/bash
while IFS=, read -r f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 f12
do
ENCRYPT_VAL="$f5" | openssl aes-256-cbc -a -pbkdf2 -salt -pass pass:{*****}
if [ "$f4" = "m" ]
then
mongo a11_USER_gender --eval "db.m.insert({username: '$f1', first: '$f2', last: '$f3', gender: '$f4', dob: '$ENCRYPT_VAL', state: '$f6', municipality: '$f7', season: '$f8', continent: '$f9', elective: '$f10', f1: '$f11', airline: '$f12'})"
echo "Male Original value: '$f5'"
echo "Male Encrypted value: $ENCRYPT_VAL"
else
mongo a11_USER_gender --eval "db.f.insert({username: '$f1', first: '$f2', last: '$f3', gender: '$f4', dob: '$ENCRYPT_VAL', state: '$f6', municipality: '$f7', season: '$f8', continent: '$f9', elective: '$f10', f1: '$f11', airline: '$f12'})"
echo "Female Original value: '$f5'"
echo "Female Encrypted value: $ENCRYPT_VAL"
fi
done < /root/FileName.csv

我能够看到变量已经成功地分配了加密的值,并且Mongo插入似乎是成功的。但是,当我访问Mongo本身内部的数据时,它为该列显示空白。我完全不知道是什么原因造成的。我已经尝试过以各种不同的方式将变量封装在eval命令中。我知道我可以在插入之前加密并将值保存到CSV中,但我仍然觉得我尝试的解决方案应该有效?

看似正确的加密示例:

MongoDB shell version v5.0.9
connecting to:mongodb://127.0.0.1:27017/a11_USER_gender?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("7d51958e-1550-4abc-ad2e-dbb8f0297646") }
MongoDB server version: 5.0.9
WriteResult({ "nInserted" : 1 })
Female Original value: 'february 20 1987'
Female Encrypted value:
U2FsdGVkX1/bKsrdCX7844Ozr6PkYRZnVZRcguYSBJE=

Mongo条目错误示例如下:

{
"_id" : ObjectId("62c21fa9463288ccfaddba16"),
"username" : "zc1615",
"first" : "zeena",
"last" : "crayton",
"gender" : "f",
"dob" : "",
"state" : "ne",
"municipality" : "coral_gables",
"season" : "summer",
"continent" : "asia",
"elective" : "mad3301",
"f1" : "williams",
"airline" : "gol"
}

This:

ENCRYPT_VAL="$f5" | openssl aes-256-cbc -a -pbkdf2 -salt -pass pass:{*****}

不将ENCRYPT_VAL设置为openssl命令的输出。它暂时将ENCRYPT_VAL设置为$f5的值(见下文),然后在null输入下运行openssl(将结果打印到控制台)。所以:

  • 你不是捕捉openssl的输出,和
  • 您实际上没有设置ENCRYPT_VAL(这就是为什么您最终在Mongo中使用空字符串)

如果您想在变量中捕获命令的输出,请使用$(...),如下所示:

ENCRYPT_VAL="$( echo "$f5" | openssl aes-256-cbc -a -pbkdf2 -salt -pass pass:{*****} )"

Bourne shell及其衍生物允许您通过在命令前加上变量表达式来为命令提供临时环境。例如,我们可以这样做:

$ FOO=bar sh -c 'echo $FOO'
bar

sh命令的环境中设置变量FOO。它不会在当前shell中设置shell变量,也不会改变当前shell的环境。

当你写:

ENCRYPT_VAL="$f5" | openssl aes-256-cbc -a -pbkdf2 -salt -pass pass:{*****}

你正在使用完全相同的语法,除了你甚至没有指定一个命令,所以它完全是一个无操作。

最新更新