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

Jcraft 1.50 SFTP覆盖失败返回Failure ID4问题求助

解决JSch 1.50中覆盖文件失败(Failure ID4)的问题

结合你描述的场景——能正常写入但覆盖失败、WinSCP用相同凭据无问题、暂不想升级版本,我整理了几个针对JSch 1.50的可行解决方案:

  • 确认覆盖模式是否正确设置
    JSch的put方法默认行为不是直接覆盖,而是续传已存在的文件,所以必须显式传入ChannelSftp.OVERWRITE参数才会触发覆盖逻辑。检查你的代码是否有类似正确写法:

    // 明确指定覆盖模式
    channelSftp.put(localFilePath, remoteFilePath, ChannelSftp.OVERWRITE);
    

    如果之前漏掉了第三个参数,这大概率是问题根源。

  • 手动实现"删传"替代覆盖
    JSch 1.50的OVERWRITE模式确实存在已知兼容性bug,部分服务器下无法正确触发覆盖指令。可以绕过这个问题,先尝试删除远程文件,再上传新文件:

    String remoteTarget = "/your/target/path/filename.txt";
    try {
        // 尝试删除远程文件,文件不存在时忽略异常
        channelSftp.rm(remoteTarget);
    } catch (SftpException e) {
        // 仅当异常不是"文件不存在"时抛出
        if (e.getID() != ChannelSftp.SSH_FX_NO_SUCH_FILE) {
            throw new RuntimeException("删除远程文件失败", e);
        }
    }
    // 上传新文件
    channelSftp.put(localFilePath, remoteTarget);
    

    这个逻辑和WinSCP的覆盖行为一致,基本能解决问题。

  • 调整SFTP协议版本
    部分服务器对JSch默认的SFTP版本兼容性较差,导致覆盖指令无法被正确解析。可以尝试强制指定SFTP版本:

    ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
    channelSftp.connect();
    // 尝试设置为版本3(多数服务器兼容的稳定版本)
    channelSftp.setVersion(3);
    

    可以多试几个版本(比如2、4),找到和服务器匹配的选项。

  • 检查并修改远程文件权限
    少数情况下,远程文件的只读属性会导致JSch覆盖失败,而WinSCP会自动修改权限后完成覆盖。这种场景下可以先调整权限再上传:

    try {
        // 将文件权限改为可写(0644为例,可根据实际需求调整)
        channelSftp.chmod(0644, remoteTarget);
    } catch (SftpException e) {
        if (e.getID() != ChannelSftp.SSH_FX_NO_SUCH_FILE) {
            throw e;
        }
    }
    channelSftp.put(localFilePath, remoteTarget, ChannelSftp.OVERWRITE);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:27:10