mongodb - bash中嵌套引号的问题:通过ssh在docker容器中查询的mongodump

标签 mongodb bash docker

我正在备份位于Docker容器中的数据库,并且由于总文件大小太大而无法容纳剩余的磁盘空间,因此我通过SSH执行该文件并使用此命令将其转储到本地PC上(我使用的是Ubuntu默认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 --gzip'" > myfile.dump

这工作得很好,但是我很难让它与--query命令一起使用。 Mongodump requires it to be in strict JSON,我在使bash中的嵌套引号起作用时遇到了麻烦。我最成功的尝试(也就是实际上成功地执行了命令而不是返回语法/ JSON错误)是这样的字符串文字,但是这似乎将JSON解析为错误,因为无论查询如何,它始终返回0个文档:

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

使用此数量的嵌套引号将严格JSON传递给--query参数的正确方法是什么?

最佳答案

由于您具有多个引用层,因此将每个层分配给一个变量最简单。然后使用bash的printf %q自动引用要在shell中使用的任何字符串。

#! /usr/bin/env bash
json='{"_id": { "'"$oid"'": "some_random_object_id" } }'
cmd="mongodump --archive -u=admin --authenticationDatabase=admin -p=mongo-pwd --db=my-db --collection=my-collection --query=$(printf %q "$json") --gzip"
sshCmd="docker exec container-id /bin/sh -c $(printf %q "$cmd")"

docker-machine ssh my-machine-image "$sshCmd"

关于mongodb - bash中嵌套引号的问题:通过ssh在docker容器中查询的mongodump,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61895247/

相关文章:

javascript - 用express更新了文档

performance - 非常奇怪-添加复合索引会使查询变慢(MongoDB)

linux - 怎么会出现 "squeeze-repeated"字样呢?

linux - 如何在 bash 脚本中使用 wget 命令下载目录中的文件?

java - 无法使用 Java Spring Boot 通过 Rest API 在两个 Docker 容器之间进行通信

javascript - 有没有办法使用 MongoDB 查询对象来过滤常规 JavaScript 数组?

java - MongoDB-Java : Not operator and regular expressions

JVM 关闭时 Java 子进程死亡

macos - Docker 容器中本地模式的 PySpark 出现奇怪的异常

docker - Aspose Word v18.8.0 中的“SkiaSharp.SKImageInfo”异常