shell 错误:位置参数太多:站点临时表FROM wp_postmeta WHERE元关键字

jw5wzhpr  于 2022-12-13  发布在  Shell
关注(0)|答案(1)|浏览(124)

我这里有一个Jenkins阶段,它试图嘘和执行一个命令。

stage("example"){
script{

sh "ssh -o StrictHostKeyChecking=no ${WPENGINE_ENV}@${WPENGINE_ENV}.${DOCKER_NODE} wp db query \"SELECT * FROM wp_postmeta WHERE meta_key LIKE ${topic_name}\""
}

}

我得到以下错误

+ ssh -o StrictHostKeyChecking=no bts@btse.ssh.wpengi.net wp db query SELECT * FROM wp_postmeta WHERE meta_key LIKE 'bt_topic%'
Warning: Permanently added '' (RSA) to the list of known hosts.
Error: Too many positional arguments: sites tmp FROM wp_postmeta WHERE meta_key LIKE bt_topic%

这是由于'“'。Jenkins不接受select语句前的”“。有人能帮忙吗?

laik7k3q

laik7k3q1#

虽然我既不精通Groovy也不精通wp,但我将尝试一个答案:
错误消息中的 sites tmp 告诉我们,shell解释了*,导致执行文件名生成。

ssh -o StrictHostKeyChecking=no XXX@YYY.ZZZ wp db query "SELECT * FROM wp_postmeta WHERE meta_key LIKE TTTT"

(with从变量中填入XXX,YYY等的适当值)。这反过来意味着,在shell吃下此命令中的引号后,ssh将以下值视为位置参数(即在选项之后):
参数1:XXX@YYY.ZZZ参数2:wp参数3:数据库参数4:查询参数5:SELECT * FROM wp_postmeta WHERE元关键字LIKE TTTT
ssh现在在远程主机(arg 1)上调用shell并向其传递以下命令

wp db query SELECT * FROM wp_postmeta WHERE meta_key LIKE TTTT

您可以看到shell被要求展开'*'文件名。这是不好的。
我不知道wp db query命令,但是假设在query之后,一个单个参数应该表示查询,则正在执行的命令应该如下所示

wp db query 'SELECT * FROM wp_postmeta WHERE meta_key LIKE TTTT'

因此,我们需要提供单引号,以确保远程shell在查询后只看到一个参数,并且不会自己进行任何有趣的扩展。

sh "ssh -o StrictHostKeyChecking=no ${WPENGINE_ENV}@${WPENGINE_ENV}.${DOCKER_NODE} wp db query \"'SELECT * FROM wp_postmeta WHERE meta_key LIKE ${topic_name}'\""

更新(基于OP的注解):

如果topic_name本身包含需要保留为查询一部分的单引号,则有两种可能性:
1.修改变量topic_name,使每个'都表示为\'
1.仅当topic_name保证包含双引号时:将命令编写为
sh“ssh -o严格主机密钥检查=否${WPENGINE_ENV}@${WPENGINE_ENV}.${DOCKER_NODE} wp数据库查询”'SELECT * FROM wp_postmeta WHERE元密钥LIKE '${主题名称}"”
警告:在这两种情况下,请确保topic_name不包含反斜杠。如果包含反斜杠,则必须对其进行转义。

相关问题