使用Apache Mina sshd的ScpClient上传文件时ScpHelper.readAck()抛出异常
解决Apache MINA SSHD ScpClient上传报EOFException的问题
问题诊断
你遇到的java.io.EOFException: readAck - EOF before ACK异常,核心原因是远程SCP进程提前终止了SSH通道,导致本地客户端无法读取到预期的ACK响应。结合你提到命令行SCP能正常工作的情况,最可能的触发点是代码中错误使用了ScpClient.Option.Recursive选项。
具体原因
ScpClient.Option.Recursive是专门用于上传目录时递归处理子目录和文件的选项,但你当前上传的是单个文件/tmp/test.txt,启用这个选项会让远程SCP进程接收到不符合预期的指令,从而直接关闭连接,导致本地客户端收不到ACK信号,最终抛出EOF异常。
修复方案
移除ScpClient.Option.Recursive选项,修改后的上传代码片段如下:
scpClient.upload( source, "/home/renderingacc/README.md", ScpClient.Option.PreserveAttributes);
额外排查建议(若上述修复无效)
- 确认目标路径的父目录
/home/renderingacc/存在,且当前SSH用户拥有该目录的写入权限(虽然命令行可正常上传大概率无权限问题,但可再次验证) - 检查远程服务器的SCP配置,比如是否存在自定义的
scp命令包装脚本(强制添加特定参数),可通过代码执行远程命令which scp和scp -V确认远程SCP的版本与执行路径 - 尝试移除
ScpClient.Option.PreserveAttributes选项,部分老旧版本的SCP服务器可能不支持属性保留功能
内容的提问来源于stack exchange,提问作者fsegers
相关产品推荐
相关产品推荐

