You need to enable JavaScript to run this app. 使用JSch实现Java双跳SSH连接时第二会话报Connection reset错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

使用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();

如果修改后仍报错,可按以下顺序排查:

  1. 查看第一台跳板机的sshd日志,确认端口转发请求是否被sshd拦截,部分安全加固的服务器会默认禁止端口转发功能
  2. 确认目标服务器的sshd配置没有禁止来自跳板机IP的SSH连接,也没有登录次数限制、IP白名单等拦截规则
  3. 将JSch版本升级到0.1.55及以上,低版本存在已知的端口转发兼容性bug

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 18:54:04