Jenkins执行Shell调用SSH远程执行脚本后执行块失败求助
解决Jenkins SSH执行远程脚本标记失败的问题
我之前碰到过几乎一模一样的情况,咱们一步步拆解问题、搞定它:
问题根源分析
你看到的stdin: is not a tty其实是个警告信息,本身不会直接导致任务失败,但Jenkins的Execute Shell步骤是靠命令的退出码来判定成功/失败的——大概率是SSH命令返回了非0的退出码,哪怕你的远程脚本实际已经执行成功、输出文件也生成了。
具体解决方案
1. 消除tty警告并确保返回脚本真实退出码
修改你的SSH命令,把stdin重定向到/dev/null来消除tty警告,同时确保SSH返回的是远程脚本的真实退出状态:
ssh -T user@dtest.com "bash /tmp/sample.sh" < /dev/null >> result.txt
如果还是不行,可以显式让SSH传递脚本的退出码:
ssh -T user@dtest.com "bash /tmp/sample.sh; exit \$?" < /dev/null >> result.txt
2. 尝试去掉-T参数(调整伪终端分配)
-T参数会禁用伪终端分配,有些脚本可能会因为这个环境异常返回非0码。你可以先去掉-T试试:
ssh user@dtest.com "bash /tmp/sample.sh" >> result.txt
如果脚本里有隐性的交互需求(比如某些命令默认需要tty),还可以加上-t强制分配伪终端:
ssh -t user@dtest.com "bash /tmp/sample.sh" >> result.txt
3. 在Jenkins里手动控制任务退出状态
如果上面的方法都没解决,你可以在Execute Shell步骤里手动检查执行结果,主动告诉Jenkins任务是否成功:
# 执行SSH命令,同时捕获错误输出 ssh -T user@dtest.com "bash /tmp/sample.sh" >> result.txt 2>&1 # 自定义成功判定逻辑:比如检查输出文件存在,且包含预期内容 if [ -f result.txt ]; then exit 0 # 告诉Jenkins任务成功 else exit 1 # 标记任务失败 fi
快速验证小技巧
你可以在Execute Shell里加一行echo $?,用来打印上一个命令的退出码,这样就能快速确认是SSH本身的问题,还是远程脚本真的执行出错了。
内容的提问来源于stack exchange,提问作者Manigandan Thanigai Arasu
相关产品推荐
相关产品推荐

