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
相关产品推荐
相关产品推荐

