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

Bash嵌套引号问题:通过SSH在Docker容器中执行带Query的mongodump

解决多层Shell嵌套下mongodump --query的JSON传递问题

这个多层引号嵌套的坑确实挺让人头疼的,我来帮你拆解问题根源,再给几个可行的解决方案:

问题根源

你之前的命令返回0条文档,核心原因不是引号语法错误,而是JSON里的$oid中的$符号被远程的/bin/sh当成了变量解析。因为远程shell会把$oid视为一个未定义的变量,替换成空字符串,最终传递给mongodump的查询条件变成了{ "_id": { "": "some_random_object_id" } },自然查不到匹配的文档。

解决方案

方案一:逐层转义特殊字符

针对每层shell的解析规则,手动转义$和引号,确保最终传到mongodump的JSON是完整的:

docker-machine ssh my-machine-image "docker exec container-id /bin/sh -c 'mongodump --archive -u=admin --authenticationDatabase=admin -p=mongo-pwd --db=my-db --collection=my-collection --query=\"{ \\\"_id\\\": { \\\"\\$oid\\\": \\\"some_random_object_id\\\" } }\" --gzip'" > myfile.dump
  • 外层用双引号包裹ssh命令,里面的双引号需要用\"转义
  • $oid中的$需要转义两次:\\$,这样本地bash解析后传到远程shell时变成\$,远程shell就不会把它当成变量了

方案二:用单引号转义技巧包裹查询条件

利用bash中单引号的转义技巧'\''(即结束当前单引号→插入一个单引号→重新开启单引号),可以更清晰地包裹查询字符串:

docker-machine ssh my-machine-image "docker exec container-id /bin/sh -c 'mongodump --archive -u=admin --authenticationDatabase=admin -p=mongo-pwd --db=my-db --collection=my-collection --query='\''{ \"_id\": { \"\$oid\": \"some_random_object_id\" } }'\'' --gzip'" > myfile.dump
  • 这里的'\''会让远程shell收到完整的单引号包裹的查询参数,同时\$确保$oid不会被远程shell解析

方案三:用--queryFile避免引号嵌套(推荐)

如果查询条件比较复杂,最省心的方法是把JSON写到本地文件,传到远程机器后用--queryFile参数读取,彻底绕开引号问题:

  1. 本地创建query.json文件,内容为:
{ "_id": { "$oid": "some_random_object_id" } }
  1. 把文件传到远程机器:
docker-machine scp query.json my-machine-image:/tmp/query.json
  1. 执行备份命令:
docker-machine ssh my-machine-image "docker exec container-id /bin/sh -c 'mongodump --archive -u=admin --authenticationDatabase=admin -p=mongo-pwd --db=my-db --collection=my-collection --queryFile=/tmp/query.json --gzip'" > myfile.dump

这个方法不仅避免了繁琐的转义,还让查询条件更易维护,适合复杂的JSON查询。

内容的提问来源于stack exchange,提问作者nn3112337

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:02:48