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

Jenkins流水线执行sshCommand报BadExitStatusException退出码1如何解决

报错信息:org.hidetake.groovy.ssh.session.BadExitStatusException: Command returned exit status 1

问题产生原因
  • 引号嵌套冲突:sshCommand的command参数外层使用双引号包裹,内部awk定义FS时又直接使用双引号,Groovy解析时会将内层双引号识别为command参数的结束标记,导致命令语法被截断,执行后返回退出码1。
  • grep匹配失败返回非0值:如果testFile.sh中没有包含ACTIVATION_KEY的行,grep命令默认会返回退出码1,整条管道命令会返回该非0值触发报错。
  • 文件读取异常:testFile.sh不在ssh执行的默认工作目录下,或者sudo执行用户没有该文件的读取权限,导致cat命令读取失败返回1。
  • 变量作用域问题:当前写法仅将变量赋值在ssh会话的子shell中生效,虽不会直接触发返回码1,但如果后续无使用该变量的命令,部分环境会判定空操作异常。
修复方案

方案1:修复引号嵌套,直接获取变量值(供流水线后续步骤使用)

使用returnStdout参数直接接收命令输出,避免嵌套赋值的引号冲突:

def activationKey = sshCommand(
    remote: remote,
    // 直接用awk完成匹配和截取,减少不必要的管道,建议替换为testFile.sh的绝对路径
    command: "awk -F 'ACTIVATION_KEY=' '/ACTIVATION_KEY/{print \$2}' /your/path/testFile.sh",
    sudo: true,
    returnStdout: true
).trim()

方案2:保留ssh会话内变量赋值的写法

使用Groovy三引号包裹命令,无需转义内部引号,同时兼容grep无匹配的场景:

sshCommand remote: remote, command: """
# 匹配不到时返回空值,避免返回非0退出码
activationkey=\$(awk -F 'ACTIVATION_KEY=' '/ACTIVATION_KEY/{print \$2;exit}' testFile.sh || echo "")
# 此处添加后续需要使用activationkey变量的命令
echo \$activationkey
""", sudo: true

额外检查项

  • 替换testFile.sh为绝对路径,避免工作目录不匹配的问题
  • 提前验证sudo用户对目标文件有可读权限,可临时加测试命令ls -l /your/path/testFile.sh排查权限问题
  • 如果允许无匹配场景,可在命令末尾加|| true强制返回0退出码,避免阻断流水线

内容的提问来源于stack exchange,提问作者Yogesh Mahajan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:27:01