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

Maven Wagon插件SCP上传构件返回码0仍上传失败

问题根因

故障和访问凭证、网络连通性无关,核心触发原因是目标SSH服务器登录时自动加载的全局环境脚本输出了非预期的stderr内容,触发wagon-ssh的校验逻辑误判执行失败:

  • 日志里的/etc/profile.d/welcomer.sh: line 6: ip: command not found、TERM environment variable not set.都是SSH建立连接后自动执行的全局初始化脚本输出的内容,和wagon本身执行的mkdir命令无关。
  • 你使用的wagon-ssh 3.5.1版本存在严格校验逻辑:只要远程执行命令的stderr流不为空,即使进程退出码为0(也就是命令实际执行成功,这也是目标目录已经被创建的原因),也会直接抛出CommandExecutionException,中断后续的文件传输流程。
  • 日志开头的AgentProxyException: connector is not available只是未配置SSH Agent转发的普通提示,不影响密钥/密码认证流程,不是构建失败的原因,可以直接忽略。
排查解决步骤
  • 优先修复服务端配置(推荐方案):联系目标服务器管理员调整/etc/profile.d/welcomer.sh脚本,将欢迎信息打印、依赖交互终端的逻辑全部加判断,仅在交互式SSH登录场景下执行,避免非交互执行(比如SFTP/SCP命令调用)时输出多余内容。参考修改逻辑:
# 判断当前为交互式终端才执行欢迎类逻辑
if [[ $- == *i* ]]; then
    # 原welcomer.sh中调用ip命令、打印欢迎信息的所有逻辑全部移到这个判断块内
fi

同时修复脚本中ip命令找不到的问题:要么写ip命令的绝对路径(通常为/usr/sbin/ip),要么在非交互场景下补全PATH环境变量,彻底消除stderr报错。

  • 客户端临时绕过方案:如果暂时无法调整服务端配置,可以将wagon-ssh扩展版本降级到3.4.0之前,旧版本仅通过退出码判断命令是否执行成功,不会因为stderr有内容直接中断流程。修改扩展配置如下:
<extension>
    <groupId>org.apache.maven.wagon</groupId>
    <artifactId>wagon-ssh</artifactId>
    <version>3.3.4</version>
</extension>
  • 前置校验方法:在Jenkins任务中增加前置验证步骤,手动执行非交互SSH命令确认无多余stderr输出后再触发构建,测试命令参考:
ssh -o BatchMode=yes 上传用户名@192.168.50.20 "echo upload_test"

命令执行后无任何多余报错输出,即代表服务端配置符合wagon上传要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:45:36