如何不将 $ 解释为 bash 脚本
How to not interpret $ into bash script
我制作了一个 bin/bash 命令文件,试图
在 docker 容器中执行不同的命令。
当我启动以下命令时:
password='y$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
感谢您的帮助。
密码周围的单引号起到了防止 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();\""
我制作了一个 bin/bash 命令文件,试图 在 docker 容器中执行不同的命令。
当我启动以下命令时:
password='y$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
感谢您的帮助。
密码周围的单引号起到了防止 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();\""