Jenkins流水线通过ssh-agent执行jq命令报语法错误求助
解决Jenkins流水线中ssh执行jq命令的语法错误
问题根源
你的错误来自两个层面:
- jq语法问题:带连字符的键名(
kubeconfig-file)属于jq的非标准标识符,必须用双引号包裹,否则jq会将-识别为运算符,触发语法错误。 - shell引号嵌套问题:命令嵌套在Jenkins的
sh块、本地shell、远程ssh shell三层环境中,引号未正确转义导致外层shell提前解析了jq命令中的特殊字符。
修复方案
方案1:使用jq数组索引语法(避免双引号嵌套)
直接用数组索引方式访问带连字符的键,无需额外转义双引号,写法更简洁:
stage("common-infra-deployment"){ steps{ sshagent (credentials: ['test-private-key']){ script{ sh ''' sudo ssh -o StrictHostKeyChecking=no hci@10.x.x.x " jq '.outputs["kubeconfig-file"]' terraform.tfstate; " ''' } } } }
方案2:正确转义双引号(保留jq对象构造语法)
如果需要保留原有的对象输出格式(而非仅输出键值),需对jq命令中的双引号进行转义,避免被远程shell解析:
stage("common-infra-deployment"){ steps{ sshagent (credentials: ['test-private-key']){ script{ sh ''' sudo ssh -o StrictHostKeyChecking=no hci@10.x.x.x " jq '.outputs | {\"kubeconfig-file\"}' terraform.tfstate; " ''' } } } }
方案3:用单引号隔离远程命令
将远程执行的命令用单引号包裹,内部双引号无需转义,同时在Jenkins的sh块中对单引号进行转义:
stage("common-infra-deployment"){ steps{ sshagent (credentials: ['test-private-key']){ script{ sh ''' sudo ssh -o StrictHostKeyChecking=no hci@10.x.x.x ' jq '\''.outputs | {"kubeconfig-file"}'\'' terraform.tfstate; ' ''' } } } }
验证建议
在Jenkins外先测试ssh命令是否正常:
sudo ssh -o StrictHostKeyChecking=no hci@10.x.x.x "jq '.outputs[\"kubeconfig-file\"]' terraform.tfstate"
确认命令能正确输出kubeconfig-file的内容后,再替换到Jenkins流水线中。
内容的提问来源于stack exchange,提问作者Kapil Yadav
相关产品推荐
相关产品推荐

