我这里有一个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语句前的”“。有人能帮忙吗?
1条答案
按热度按时间laik7k3q1#
虽然我既不精通
Groovy
也不精通wp
,但我将尝试一个答案:错误消息中的 sites tmp 告诉我们,shell解释了
*
,导致执行文件名生成。(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并向其传递以下命令
您可以看到shell被要求展开'*'文件名。这是不好的。
我不知道
wp db query
命令,但是假设在query
之后,一个单个参数应该表示查询,则正在执行的命令应该如下所示因此,我们需要提供单引号,以确保远程shell在查询后只看到一个参数,并且不会自己进行任何有趣的扩展。
更新(基于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
不包含反斜杠。如果包含反斜杠,则必须对其进行转义。