上传大文件至Apache SSHD SFTP服务器时出现Outbound message too long错误
问题解决:Linux SFTP客户端向Apache SSHD服务器传大文件报"Outbound message too long"
问题背景
使用Linux原生SFTP客户端向基于mina-sshd 2.10.0搭建的SFTP服务器上传≥500KB文件时,触发错误:Outbound message too long 262197。但该服务器与FileZilla配合正常,且此客户端可向其他SFTP服务器正常上传大文件。根据代码逻辑,此错误是客户端输出缓冲区超过256KB上限时触发的。
可能原因
该问题源于客户端与mina-sshd服务器的SFTP窗口/数据包大小协商不匹配:
- mina-sshd默认的SFTP子系统窗口大小或数据包配置较保守,导致客户端需要一次性发送超过自身缓冲区限制的数据块
- 其他SFTP服务器(如OpenSSH)默认配置更适配Linux客户端的缓冲区设置,FileZilla则采用了自适应的块大小策略
解决方案
1. 调整Linux SFTP客户端的发送缓冲区
临时测试可直接在命令行指定:
sftp -o SendBuf=524288 user@your-server-ip
永久生效可修改SSH配置(全局/etc/ssh/ssh_config或用户目录~/.ssh/config):
Host your-sftp-server SendBuf 524288
将缓冲区设置为512KB(或更大),覆盖客户端默认的256KB限制。
2. 调整mina-sshd的SFTP子系统窗口大小
修改服务器代码中SFTP子系统的配置,增大窗口大小:
SftpSubsystemFactory sftpFactory = new SftpSubsystemFactory(); // 设置1MB的SFTP窗口大小,允许服务器接受更多未确认数据 sftpFactory.getSftpSettings().setSftpWindowSize(1024 * 1024); sshd.setSubsystemFactories(Collections.singletonList(sftpFactory.build()));
这样客户端无需一次性发送过大的数据块即可完成上传。
3. 限制mina-sshd的最大数据包大小
强制服务器的最大数据包大小与客户端缓冲区上限匹配:
sftpFactory.getSftpSettings().setMaxPacketSize(256 * 1024); // 256KB
确保客户端发送的数据块不会超过自身缓冲区限制。
内容的提问来源于stack exchange,提问作者Jonny Marotte
相关产品推荐
相关产品推荐

