Bash 语法错误:运行docker exec命令时未终止引号字符串

Bash 语法错误:运行docker exec命令时未终止引号字符串,bash,docker,sh,Bash,Docker,Sh,我已经处理这件事三天了。我尝试了大多数双引号和单引号的组合,查看了大多数stackoverflow问题和答案,但仍然不走运:(下面是我问题的简化版本 >line=“008256042a1b sh-c\“mysqldump数据库名” >回音$线 008256042a1b sh-c“mysqldump数据库名称” >docker exec$行 databasename“:1:databasename”:语法错误:未终止的引号字符串 问题是,您试图在$line中放置一个命令,就像要运行: sh -c

我已经处理这件事三天了。我尝试了大多数双引号和单引号的组合,查看了大多数stackoverflow问题和答案,但仍然不走运:(下面是我问题的简化版本

>line=“008256042a1b sh-c\“mysqldump数据库名”
>回音$线
008256042a1b sh-c“mysqldump数据库名称”
>docker exec$行
databasename“:1:databasename”:语法错误:未终止的引号字符串

问题是,您试图在$line中放置一个命令,就像要运行:

sh -c \"mysqldump Database\"
Database": 1: Syntax error: Unterminated quoted string
这应该起作用:

line=(008256042a1b sh -c "mysqldump databasename")
echo "${line[@]}"
docker exec "${line[@]}"
“mysqldump数据库名”
是单个字符串

\“mysqldump databasename\”
实际上是两个字符串

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

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

line=“008256042a1b sh-c\”mysqldump数据库名\


line=“008256042a1b sh-c'mysqldump databasename'”

甚至
line=“008256042a1b mysqldump数据库名”

然后
eval“docker exec${line}”


编辑:这只能在您信任$line中的内容时使用。另一方面,正如注释中提到的,这是一个安全问题。

您需要知道要在哪个容器上运行该指令…它应该类似于
docker run busybox bin/sh-c$line
@Hackerman这确切地说明了要在哪个容器中运行该命令,并且t使用
exec
来执行此操作,而不创建新的容器,而是使用环境来传递命令。OP正在尝试在现有容器中运行任务,并提供了一个。我看不出您的评论有什么关系。这是。@Hackerman,使用
$line
这种方式是有缺陷的,原因在BashFAQ#50链接abov中描述e、 @SE这只是一个评论,不是一个答案…就像CD评论一样…评论应该给出如何获得实际答案的提示…如果你没有这样理解,那是你的问题…SMH有关更多细节,我建议阅读。@SoftwareEngineer运行此程序,你会看到它正在运行` docker Run--name sleepy ubuntu sleep infinity&line=(sleepy sh-c“echo mysqldump databasename”);sleep 1;docker exec“${line[@]}”@Philippe是的,谢谢。我把你的解决方案误读(并且输入错误)为
$()
(subshell),而不仅仅是
()
(数组)。但是,我想线索在
@
。也许你可以再加一两句解释一下这个解决方案(反正是数组位)。我投了赞成票,因为这是一个有效的解决方案。但是,我正在使用这个应用程序,它有点问题,给了我一个奇怪的错误,所以谁知道呢:)这是可行的,但根本不是一个好主意。适用,这就是中描述的方法更好的原因。是的,我知道它容易被注入,但我假设输入是可信的(我希望是可信的,因为它允许在任何容器上运行任何东西!)。如果是的话,那就简单多了……通常一个数组将由将受信任和不受信任的位拼接在一起的代码组装而成,这样您就可以让第一个字段受信任,第二个字段不受信任,等等;但是对于一个字符串的求值,任何不受信任的内容都可以,它不仅可以在容器上运行任意代码,还可以在主机上运行任意代码。