使用JSch实现Java双跳SSH连接时第二会话报Connection reset错误如何解决
解决方案
- 本地转发端口避免硬编码:将固定本地端口2248改为0,让操作系统自动分配空闲端口,避免端口占用导致的连接失败
- 明确端口转发绑定地址:调用四参数重载的
setPortForwardingL方法,指定绑定地址为0.0.0.0,避免默认仅绑定127.0.0.1带来的本地访问限制 - 增加连接超时配置:调用
session.connect()时传入超时时间(单位毫秒),避免无限制等待导致的异常误判 - 提前验证网络连通性:先登录第一台跳板机,手动执行
ssh <user2>@<rhost>,确认跳板机到目标服务器的22端口网络连通、账号密码有效,排除底层网络问题
修改后可直接运行的代码:
String user = user; String host = host; String pswd = pass; JSch jsch = new JSch(); Session session = jsch.getSession(user, host, 22); session.setPassword(pswd); java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); System.out.println("Connecting to host1 "); // 增加30秒连接超时 session.connect(30000); // 本地端口传0让系统自动分配,指定绑定地址为0.0.0.0 int lport = 0; String rhost = rhost; int rport = 22; int assinged_port = session.setPortForwardingL("0.0.0.0", lport, rhost, rport); String user2 = user; String pswd2 = pswd; Session session2 = jsch.getSession(user2, "localhost", assinged_port); session2.setPassword(pswd2); session2.setConfig(config); System.out.println("Connecting to rhost via localhost:" + assinged_port); // 第二个会话也增加30秒超时 session2.connect(30000); Channel channel = session2.openChannel("exec"); ((ChannelExec)channel).setCommand("sh run"); channel.setInputStream(null); ByteArrayOutputStream errorStream = new ByteArrayOutputStream(); ((ChannelExec)channel).setErrStream(errorStream); ByteArrayOutputStream out = new ByteArrayOutputStream(); channel.setOutputStream(out); // channel也增加15秒超时 channel.connect(15000); while(true){ if(channel.isClosed()){ System.out.println("exit-status: "+ channel.getExitStatus()); break; } // 增加100毫秒休眠避免空转占用CPU Thread.sleep(100); } String result = new String(out.toByteArray()); // 用完按顺序释放资源 channel.disconnect(); session2.disconnect(); session.delPortForwardingL(assinged_port); session.disconnect();
如果修改后仍报错,可按以下顺序排查:
- 查看第一台跳板机的sshd日志,确认端口转发请求是否被sshd拦截,部分安全加固的服务器会默认禁止端口转发功能
- 确认目标服务器的sshd配置没有禁止来自跳板机IP的SSH连接,也没有登录次数限制、IP白名单等拦截规则
- 将JSch版本升级到0.1.55及以上,低版本存在已知的端口转发兼容性bug
内容的提问来源于stack exchange,提问作者Cygnemi gnon
相关产品推荐
相关产品推荐

