使用JSch连接SFTP报错SSH_MSG_DISCONNECT:11内部服务器错误求助
我之前也碰到过一模一样的情况——FileZilla能顺畅连上,但JSch代码就是抛出这个内部错误,咱们一步步来排查:
优先升级JSch版本
很多时候这个问题是旧版JSch和SFTP服务器的加密算法/协议兼容性不匹配导致的。比如服务器启用了JSch老版本不支持的新算法(像ChaCha20-Poly1305这类),直接把JSch升级到最新稳定版(比如0.1.55及以上),大概率能直接解决问题。调整PreferredAuthentications配置
你现在只配置了password,但有些SFTP服务器会强制先校验公钥认证,哪怕你想使用密码登录。可以把认证顺序改成:config.put("PreferredAuthentications", "publickey,password");让JSch按顺序尝试认证,有时候就能绕过服务器的校验逻辑,顺利建立连接。
开启JSch调试日志,抓详细交互细节
这是排查这类问题的核心手段,能看到连接过程中每一步的交互细节,比如服务器支持的算法、认证环节哪里出了问题。添加这段日志代码:jsch.setLogger(new com.jcraft.jsch.Logger() { public boolean isEnabled(int level) { return true; } public void log(int level, String message) { System.out.println("[JSch Debug] " + message); } });运行代码后看输出,比如有没有服务器拒绝某个加密算法的提示,或者认证请求被驳回的具体原因,根据日志再针对性调整。
检查密码的特殊字符处理
你的密码包含!和@这类特殊字符,虽然Java字符串直接写没问题,但可以确认下有没有不小心加了空格或者转义错误。比如用trim()处理下密码:session.setPassword("a1234!X@".trim());不过FileZilla能正常连,这个可能性相对低,但可以顺手排查下。
查看服务器端日志
如果你能访问SFTP服务器的sshd日志(比如Linux下的/var/log/auth.log),看看服务器端记录的错误信息。有时候JSch的默认请求格式和FileZilla不同,服务器会返回内部错误,从服务器日志能找到更直接的原因。
内容的提问来源于stack exchange,提问作者2Big2BeSmall

