java sftp通道建立连接时报错,在channel.connect()时报("session is down");

baidu_23891745 2014-11-24 07:04:33
项目里面需要用sftp上传图片,之前是没问题的,最近出问题报错,一直定位不到问题,在channel.connect()时报throw new JSchException("session is down");下面是代码

String ftpHost = ftpServerAddress;
String port = "22";
String ftpUserName = user;
String ftpPassword = password;
int ftpPort =22;
if (port != null && !port.equals("")) {
ftpPort = Integer.valueOf(port);
}
JSch jsch = new JSch(); // 创建JSch对象
session = jsch.getSession(ftpUserName, ftpHost, ftpPort); // 根据用户名,主机ip,端口获取一个Session对象
if (ftpPassword != null) {
session.setPassword(ftpPassword); // 设置密码
}
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config); // 为Session对象设置properties
session.setTimeout(timeout); // 设置timeout时间
session.connect(); // 通过Session建立链接

channel = session.openChannel("sftp"); // 打开SFTP通道
channel.connect(); // 建立SFTP通道的连接
return (ChannelSftp) channel;



看源码是在sendChannelOpen()里抛得异常 下面是这个函数

/* 726 */ Session _session = getSession();
/* 727 */ if (!(_session.isConnected())) {
/* 728 */ throw new JSchException("session is down");
/* */ }
/* */
/* 731 */ Packet packet = genChannelOpenPacket();
/* 732 */ _session.write(packet);
/* */
/* 734 */ int retry = 2000;
/* 735 */ long start = System.currentTimeMillis();
/* 736 */ long timeout = this.connectTimeout;
/* 737 */ if (timeout != 0L) retry = 1;
/* 738 */ synchronized (this)
/* */ {
/* 741 */ while ((getRecipient() == -1) && (_session.isConnected()) && (retry > 0)) {
/* 742 */ if ((timeout > 0L) &&
/* 743 */ (System.currentTimeMillis() - start > timeout)) {
/* 744 */ retry = 0;
/* */ }
/* */
/* */ try
/* */ {
/* 749 */ long t = (timeout == 0L) ? 10L : timeout;
/* 750 */ this.notifyme = 1;
/* 751 */ super.wait(t);
/* */ }
/* */ catch (InterruptedException e) {
/* */ }
/* */ finally {
/* 756 */ this.notifyme = 0;
/* */ }
/* 758 */ --retry;
/* */ }
/* */ }
/* 761 */ if (!(_session.isConnected())) {
/* 762 */ throw new JSchException("session is down");
/* */ }



在762行抛出异常 上面也有个判断(!(_session.isConnected()))是否连接 上面没有报错,我用sftp命令能连上服务器,也能用put命令上传文件 但是用java代码的话就是报错 现在想确认下是那个地方出问题了 是网络的原因吗还是服务器配置的问题 因为之前是能上传的 jar包是jsch-0.1.50.jar 下面是截图


求大神 困扰一周了。。。
...全文
5205 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
楼主有结果了吗?我也遇到了同样的问题,求方法
baidu_23891745 2014-11-24
  • 打赏
  • 举报
回复
这个查过 ChrootDirectory的配置如图, 没有配置这个权限,还有别的原因吗
福尔摩斯23 2014-11-24
  • 打赏
  • 举报
回复
引用 楼主 baidu_23891745 的回复:
项目里面需要用sftp上传图片,之前是没问题的,最近出问题报错,一直定位不到问题,在channel.connect()时报throw new JSchException("session is down");下面是代码 String ftpHost = ftpServerAddress; String port = "22"; String ftpUserName = user; String ftpPassword = password; int ftpPort =22; if (port != null && !port.equals("")) { ftpPort = Integer.valueOf(port); } JSch jsch = new JSch(); // 创建JSch对象 session = jsch.getSession(ftpUserName, ftpHost, ftpPort); // 根据用户名,主机ip,端口获取一个Session对象 if (ftpPassword != null) { session.setPassword(ftpPassword); // 设置密码 } Properties config = new Properties(); config.put("StrictHostKeyChecking", "no"); session.setConfig(config); // 为Session对象设置properties session.setTimeout(timeout); // 设置timeout时间 session.connect(); // 通过Session建立链接 channel = session.openChannel("sftp"); // 打开SFTP通道 channel.connect(); // 建立SFTP通道的连接 return (ChannelSftp) channel; 看源码是在sendChannelOpen()里抛得异常 下面是这个函数 /* 726 */ Session _session = getSession(); /* 727 */ if (!(_session.isConnected())) { /* 728 */ throw new JSchException("session is down"); /* */ } /* */ /* 731 */ Packet packet = genChannelOpenPacket(); /* 732 */ _session.write(packet); /* */ /* 734 */ int retry = 2000; /* 735 */ long start = System.currentTimeMillis(); /* 736 */ long timeout = this.connectTimeout; /* 737 */ if (timeout != 0L) retry = 1; /* 738 */ synchronized (this) /* */ { /* 741 */ while ((getRecipient() == -1) && (_session.isConnected()) && (retry > 0)) { /* 742 */ if ((timeout > 0L) && /* 743 */ (System.currentTimeMillis() - start > timeout)) { /* 744 */ retry = 0; /* */ } /* */ /* */ try /* */ { /* 749 */ long t = (timeout == 0L) ? 10L : timeout; /* 750 */ this.notifyme = 1; /* 751 */ super.wait(t); /* */ } /* */ catch (InterruptedException e) { /* */ } /* */ finally { /* 756 */ this.notifyme = 0; /* */ } /* 758 */ --retry; /* */ } /* */ } /* 761 */ if (!(_session.isConnected())) { /* 762 */ throw new JSchException("session is down"); /* */ } 在762行抛出异常 上面也有个判断(!(_session.isConnected()))是否连接 上面没有报错,我用sftp命令能连上服务器,也能用put命令上传文件 但是用java代码的话就是报错 现在想确认下是那个地方出问题了 是网络的原因吗还是服务器配置的问题 因为之前是能上传的 jar包是jsch-0.1.50.jar 下面是截图 求大神 困扰一周了。。。
LZ,你好!这是ChrootDirectory权限问题,sftp要求必须是750或者是755,不能设置成777!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧