You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins流水线通过ssh-agent执行jq命令报语法错误求助

解决Jenkins流水线中ssh执行jq命令的语法错误

问题根源

你的错误来自两个层面:

  1. jq语法问题:带连字符的键名(kubeconfig-file)属于jq的非标准标识符,必须用双引号包裹,否则jq会将-识别为运算符,触发语法错误。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:40:28