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

标签 java sftp jsch lftp

我正在 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。

enter image description here

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

enter image description here

我刚刚在 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/

相关文章:

java - 在Java中,我可以跟踪每种情况的switch语句中的所有值吗?

java - 字符串比较,字母顺序

java - 如何确保监视目录中通过SFTP上传的所有文件都可以通过Java7使用?

java - 如何使用 jsch 和代理命令进行端口转发

java - 使用 jsch 自动向下滚动 shell

java - session .connect : java.net.ConnectException

java - Android Java 类中是否需要声明上下文?

下载完整目录命令行psftp

ubuntu - Proftpd - 带虚拟用户的 SFTP

java - 如何在 SFTP 中返回系统类型?