我正在备份位于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/