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

