JSch连接远程服务器报错End of IO Stream Read求助
解决JSch发送SSH_MSG_KEX_ECDH_INIT后断开的问题
排查与修复步骤
确认服务器KEX算法支持
登录远程服务器执行ssh -Q kex,查看服务器实际支持的密钥交换算法列表。如果ecdh-sha2-nistp256不在其中,指定该算法无效,需替换为服务器支持的类型(比如diffie-hellman-group-exchange-sha256)。同步配置加密套件组合
单独指定KEX可能不足以完成握手,需同时匹配加密、MAC算法。在代码中补充配置:session.setConfig("kex", "diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256"); session.setConfig("cipher.s2c", "aes128-ctr,aes192-ctr,aes256-ctr"); session.setConfig("cipher.c2s", "aes128-ctr,aes192-ctr,aes256-ctr"); session.setConfig("mac.s2c", "hmac-sha2-256,hmac-sha1"); session.setConfig("mac.c2s", "hmac-sha2-256,hmac-sha1");优先选用服务器已开启的套件,避免算法不匹配导致握手中断。
临时关闭HostKey检查(仅测试用)
HostKey验证失败可能伪装成IO断开,可临时关闭检查排除该因素:session.setConfig("StrictHostKeyChecking", "no");注意:生产环境需配置正确的HostKey,不要保持该设置。
升级JSch版本
旧版JSch存在ECDH握手相关兼容性bug,建议升级到最新稳定版(如0.1.55及以上),多数握手异常已在新版本中修复。检查服务器SSH配置
远程服务器端查看/etc/ssh/sshd_config:- 确认
KexAlgorithms未禁用你使用的算法 - 将
LogLevel设为VERBOSE,查看/var/log/auth.log(或对应系统日志),里面会记录握手失败的具体原因(如算法不支持、密钥长度不符合要求等)。
- 确认
调试技巧
- 开启JSch DEBUG日志,获取握手细节:
日志会显示服务器返回的KEX算法列表,可快速对比定位不兼容项。JSch.setLogger(new Logger() { @Override public boolean isEnabled(int level) { return true; } @Override public void log(int level, String message) { System.out.println(message); } });
内容的提问来源于stack exchange,提问作者Molasses
相关产品推荐
相关产品推荐

