【问题标题】:Multiple mongo commands in kubernetes not workingKubernetes 中的多个 mongo 命令不起作用
【发布时间】:2019-01-28 02:36:47
【问题描述】:

我正在尝试将以下一系列可以正常工作的命令自动化到 BASH 脚本中:

kubectl exec -it mongo-pod -- bash
mongo DBNAME
db.auth("theUser", "thePw")
db.theCollection.find()

我使用的脚本如下:

#!/bin/bash

kubectl exec -it mongo-pod -- bash -c "mongo DBNAME && /
db.auth("theUser", "thePw") && /
db.theCollection.find()"

我尝试了以下方法: Executing multiple commands( or from a shell script) in a kubernetes pod 但是在第一次使用 & 或 && 之后添加的任何命令都不会执行。例如,仅使用“mongo DBNAME”正确打开提示符并将其设置为正确的数据库,但使用 && 添加任何其他命令会导致所有命令失败并显示以下内容:

bash: -c line 0: 意外标记“theUser”附近的语法错误

【问题讨论】:

  • db.auth(...db.theCollection... 命令是 mongo 命令吗?在编写脚本时,在成功退出上一个命令后,它们正在由 bash 执行(这就是 && 所做的)
  • 是的,这些是 mongo 命令,看这个问题stackoverflow.com/questions/4837673/…
  • 我会直接调用 mongo shell kubectl exec -it mongo-pod -- mongo "<COMMANDS>" 然后查看 here
  • @Will Barnwell 我查看了stackoverflow.com/questions/4837673/… 中的解决方案,但无法让这些解决方案中的任何一个与“kubectl exec -it mongo-pod -- bash -c " 过去的第一个命令。
  • @stacksonstacks 当我使用“kubectl exec -it mongo-pod -- mongo”时,我连接到 pod 中的 mongodb(类似于我使用 -- bash 选项时),但我不确定在哪里根据您链接的 MongoDB 手动脚本描述从那里开始。具体来说,我已经连接到 db,但是没有 javascript 变量 db 来执行命令,而无需通过 new Mongo().getDB("theDB") 之类的东西重新连接。

标签: mongodb bash kubernetes


【解决方案1】:

所有的 cmets 都是正确的,但至少有两件事我最有信心我有答案:

首先,你的续行字符错误;它应该是\ 而不是/。如果您将 bash 切换到“出错时退出”模式,则实际上甚至不需要

kubectl exec -it mongo-pod -- bash -ec "mongo DBNAME
echo 'this command only runs if mongo exits a-ok'
exit 1
and this never will run
"

然而,另一个错误在于使用的引号字符:如果您有bash -c ",那么您必须对内部字符串文字使用单引号,或者使用\" 转义它们。您实际上可以通过查看问题中 shell sn-p 的语法突出显示来了解我在说什么。观察到字符串文字是红色的,但是文本 theUserthePw 都是黑色的——这是因为它们在字符串文字之外,因为字符串在遇到的第一个 " 处停止——那个出现在db.auth("

几乎总是在这样的远程调用 bash 时需要使用单引号,原因有几个,但最相关的是您可以使用 db.auth("something") 而无需不必要地转义双引号。

由于mongo(像许多解释器,如nodepython)希望您以交互方式输入它,在其“标准输入”上提供输入,或者给它一个包含命令的本地文件,您将希望根据您的需要将调用更改为其中一种策略。

无需使用echoprintf 及其相关引用地狱的重定向标准输入的一种非常方便的方法是在bash 中使用"here documents" (abbreviated "heredocs")

kubectl exec -it mongo-pod -- bash -ec 'mongo DBNAME<<"FOO"
db.auth("theUser", "thePw")
printjson(db.theCollection.find())
FOO
'

这导致 bash 将两个“heredoc 分隔符”之间的几乎所有字符传输到命令的标准输入。如果你引用分隔符,就像我对 [任意] 字 FOO 所做的那样,那么内容不会受到变量扩展、命令插值等的影响,这可能是避免反引号和美元符号怪异的另一种机制。

【讨论】:

  • 你答案的后半部分令人困惑,我不确定你为什么包含命令扩展的东西。 OP 没有尝试使用命令扩展,heredocs 也不是命令扩展不当的解决方案。话虽如此,heredocs 是应对 OP 挑战的巧妙解决方案。如果你删除了命令扩展的东西,这个答案会很好,而是解释了为什么 heredoc 正在解决向 mongo 的交互式 shell 发送多个命令的问题
猜你喜欢
  • 1970-01-01
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2016-06-11
  • 2014-05-03
  • 2014-12-07
  • 1970-01-01
相关资源
最近更新 更多