【问题标题】:Syntax error: Unterminated quoted string while running docker exec command [duplicate]语法错误:运行 docker exec 命令时未终止的引号字符串 [重复]
【发布时间】:2021-07-29 05:38:35
【问题描述】:

我已经处理了大约 3 天。我尝试了大多数双引号和单引号的组合,查看了大多数 stackoverflow 问题和答案,但仍然没有运气:( 下面是我的问题的简化版本。

> line="008256042a1b sh -c \"mysqldump databasename\""
> echo $line
008256042a1b sh -c "mysqldump databasename"
> docker exec $line
databasename": 1: databasename": Syntax error: Unterminated quoted string

【问题讨论】:

  • 您需要知道要在哪个容器上运行该指令...应该类似于docker run busybox bin/sh -c $line
  • @Hackerman 这会准确说明要在哪个容器中运行命令,它使用exec 来执行此操作,而无需创建新容器,而是使用环境来传递命令。 OP 正在尝试在现有容器中运行任务并提供了minimal reproducible example。我看不出你的评论有什么相关性。
  • 这是BashFAQ #50
  • @Hackerman,由于上面 BashFAQ #50 链接中描述的原因,以这种方式使用 $line 是错误的。
  • @SE 这只是一个评论,而不是一个答案......就像 CD 评论一样......cmets 应该给出关于如何获得实际答案的提示......如果你没有得到那样的话,这是你的问题......SMH

标签: bash docker sh


【解决方案1】:

您也可以替换“docker exec”吗?
然后它就变成了

line="008256042a1b sh -c \"mysqldump databasename\""

line="008256042a1b sh -c 'mysqldump databasename'"
甚至
line="008256042a1b mysqldump databasename"

那么
eval "docker exec ${line}"

edit:这只能在您信任 $line 中的内容时使用。否则,这是 cmets 中提到的安全问题。

【讨论】:

  • 工作,但这根本不是一个好主意。 BashFAQ #48 适用,这就是为什么BashFAQ #50 中描述的方法更好。
  • 是的,我知道它很容易被注入,但我认为输入是可信的(我希望它是可信的,因为它允许在任何容器上运行任何东西!)。如果是,那就简单多了……
  • 通常一个数组将由将可信和不可信位拼凑在一起的代码组装起来,所以你可以让第一个字段是可信的,第二个字段是不可信的,等等;但是对于评估字符串,任何不受信任的东西,它不仅可以在容器上运行任意代码,还可以在主机上运行。
【解决方案2】:

问题是你试图在 $line 中放一个命令,就像你想运行一样:

sh -c \"mysqldump Database\"
Database": 1: Syntax error: Unterminated quoted string

这应该可行:

line=(008256042a1b sh -c "mysqldump databasename")
echo "${line[@]}"
docker exec "${line[@]}"

"mysqldump databasename" 是一个字符串。

\"mysqldump databasename\" 实际上是两个字符串。

"${line[@]}" 允许正确扩展数组项。

【讨论】:

  • 更多详情,我推荐阅读mywiki.wooledge.org/BashFAQ/050
  • @SoftwareEngineer 运行这个,你会看到它正在工作 `docker run --name sleepy ubuntu sleep infinity & line=(sleepy sh -c "echo mysqldump databasename");睡觉1; docker exec "${line[@]}"'
  • @Philippe 是的,这行得通,谢谢。我会将您的解决方案误读(并输入错误)为$()(子shell),而不仅仅是()(数组)。但是,我想线索在@ 中。也许您可以添加一两个词来解释解决方案(无论如何是数组位)。
  • 我投了赞成票,因为它是一个可行的解决方案。但是,我正在使用该应用程序,它有点错误,给了我一个奇怪的错误,所以谁知道:)
猜你喜欢
  • 2023-02-02
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多