mongodb - 如何不将 $ 解释为 bash 脚本
问题描述
我制作了一个 bin/bash 命令文件,试图在 docker 容器中执行不同的命令。
当我启动以下命令时:
password='$2y$10$vXBqzZa3oNhMG/3qj10weehWDP4rkfn/R0sctThBb5nLDpLjOlLSu'
docker exec -it ${imageName} /bin/sh -c "mongo -u user -p password --eval \"db = db.getSiblingDB('db'); db.users.insertOne({'role':'Admin', 'name':'aaa', 'email':'a@a.com', 'password': '${password}' }); db.users.find();\" "
它运行并成功地将新的“Admin”用户插入数据库“db”(mongoDb),但它错误地解析了“password”变量。
{ "_id" : ObjectId("5d7d4aee81d1b750455423ef"), "role" : "Admin", "name" : "aaa", "email" : "a@a.com", "password" : "y0/3qj10weehWDP4rkfn/R0sctThBb5nLDpLjOlLSu" }
我认为 bash 将特殊字符 $ 解释为变量。
所以密码的第一部分:$2y$10$vXBqzZa3oNhMG
变成:y0
感谢您的帮助。
解决方案
Password 周围的单引号起到了防止 shell 扩展的作用,但是 mongo shell 又是如何使用--eval \"db
双引号来扩展 shell 变量的呢?所以你仍然需要在密码变量中对mongo shell中的shell扩展进行转义,所以最好在密码中添加转义字符。
password='\$2y\$10\$vXBqzZa3oNhMG/3qj10weehWDP4rkfn/R0sctThBb5nLDpLjOlLSu'
echo ${password}
docker exec -it ${imageName} \
/bin/sh -c "mongo -u root -p root_password --eval \"db = db.getSiblingDB('db'); db.users.insertOne({'role':'Admin', 'name':'aaa', 'email':'a@a.com', 'password': '${password}' }); db.users.find();\""