使用 jcraft.jsch 更改目录时文件夹不存在
Folder does not exists when changing directory using jcraft.jsch
我运行正在 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。
堆栈跟踪指向 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 机器 运行s JDK 1.6.0_29 而 Linux 服务器 运行s JRE 1.6.0.27)
jsch 是否依赖于客户端 OS 级别的其他库?
知道如何解决这个问题吗?
重要更新
我能够在我的开发机器上重现错误。它与正在使用的 jsch 版本有关。 linux 服务器使用 jsch-0.1.31,而开发机器使用 jsch-0.1.52。似乎导致错误的原因已经在 0.1.52 版本中解决了。哇!哇!终于!
谢谢
尝试执行以下操作。
fn = c.ls("Inbox");
c.cd("Inbox");
升级到 jsch 版本 0.1.52 解决了这个问题。
我运行正在 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。
堆栈跟踪指向 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 机器 运行s JDK 1.6.0_29 而 Linux 服务器 运行s JRE 1.6.0.27)
jsch 是否依赖于客户端 OS 级别的其他库?
知道如何解决这个问题吗?
重要更新
我能够在我的开发机器上重现错误。它与正在使用的 jsch 版本有关。 linux 服务器使用 jsch-0.1.31,而开发机器使用 jsch-0.1.52。似乎导致错误的原因已经在 0.1.52 版本中解决了。哇!哇!终于!
谢谢
尝试执行以下操作。
fn = c.ls("Inbox");
c.cd("Inbox");
升级到 jsch 版本 0.1.52 解决了这个问题。