首页 > 解决方案 > 如何不将 $ 解释为 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

感谢您的帮助。

标签: mongodbbashdockerhashspecial-characters

解决方案


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();\""


推荐阅读