我在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,则可以cd正常播放。

java - 使用jcraft.jsch更改目录时文件夹不存在-LMLPHP

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进行连接时,远程站点的文件夹结构如下所示:

java - 使用jcraft.jsch更改目录时文件夹不存在-LMLPHP

我刚刚在Windows台式机上执行了相同的Java代码,并且cd命令起作用了。 (Windows计算机运行JDK 1.6.0_29,而Linux服务器运行JRE 1.6.0.27)

jsch是否在客户端的操作系统级别上依赖其他库?

您知道如何解决此问题吗?

重要更新

我能够在开发机器上重现该错误。这与所使用的jsch版本有关。 linux服务器使用的是jsch-0.1.31,而开发机使用的是jsch-0.1.52。似乎导致该错误的所有问题都已在0.1.52版中解决。 ! !最后!

谢谢

最佳答案

升级到jsch 0.1.52版可解决此问题。

关于java - 使用jcraft.jsch更改目录时文件夹不存在,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38679471/

10-13 21:28