我在Linux机器上运行一个Java程序,它使用jcraft.jsch库连接到外部sftp服务器。代码如下:
JSch jsch = new JSch();
Session session = null;
Channel channel = null;
ChannelSftp c = null;
session = jsch.getSession(ftpUserName, ftpHost, ftpPort);
session.setPassword(ftpPassword);
channel = session.openChannel("sftp");
channel.connect();
c = (ChannelSftp)channel;
fn = c.ls("/Inbox");
c.cd("/Inbox"); //-- this line throws an error
出于某种原因,当我运行更改目录命令" c.cd"我明白了:
4: Folder not found: /drwxr-x--- 2 ftpadmin ftpadmin 0 Jan 01 1970 /Inbox
这很奇怪,因为该文件夹的列表(c.ls)不会引发异常。
此外,如果我从同一台Linux服务器命令行lftp,我可以没有任何问题。
stacktrace指向cd方法中的_stat方法。
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2108)
at com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:1676)
at com.jcraft.jsch.ChannelSftp.cd(ChannelSftp.java:290)
at BW_Utilities.ftp.test.testFtpJsch(test.java:81)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
当我从桌面使用Filezilla进行连接时,远程站点的文件夹结构如下所示:
我刚刚在我的Windows桌面计算机上执行相同的Java代码,cd命令工作正常。 (Windows机器运行JDK 1.6.0_29而Linux服务器运行JRE 1.6.0.27)
jsch是否依赖客户端操作系统级别的其他库?
知道如何解决这个问题?
重要的更新
我能够在我的开发机器上重现错误。它与使用的jsch版本有关。 linux服务器使用的是jsch-0.1.31,而dev机器使用的是jsch-0.1.52。似乎导致错误的任何内容已在版本0.1.52中得到解决。 Wooot! Wooot!终于来了!
谢谢
答案 0 :(得分:2)
升级到jsch版本0.1.52修复了该问题。
答案 1 :(得分:1)
尝试执行以下操作。
fn = c.ls("Inbox");
c.cd("Inbox");