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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:35:09