子文件夹级别的JSCH(SFTP)在更改目录上失败(第二级)

时间:2013-04-17 23:43:46

标签: sftp jsch

当前一个目录不在根目录(ftp home)中时,JSch的SFTP通道无法更改目录。它仅在某些SFTP服务器上发生,而不是全部发生。

例如,目录结构是:

  • /
    • 1级
      • 2级

cd level-1(好)
cd level-2(失败)

它抛出了这样的异常

4: Folder not found: /level-1/level-2
    at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2569)
    at com.jcraft.jsch.ChannelSftp._realpath(ChannelSftp.java:2100)
    at com.jcraft.jsch.ChannelSftp.cd(ChannelSftp.java:315)

错误的SFTP服务器返回/作为根的 realpath 。未失败的其他服务器返回完整路径列表/usr/account

2 个答案:

答案 0 :(得分:1)

我看起来像服务器端问题/错误。服务器可能会错误地实现SSH_FXP_REALPATH请求。

帐户,您是否登录,chrooted?谁是chrooting,SFTP服务器还是系统级chrooting?

如果您共享日志文件,您可能会得到更具体的答案。

您还可以尝试其他一些遵循SFTP规范的SFTP客户端,并在输入目录时使用SSH_FXP_REALPATH请求(许多客户端不这样做)。它不一定是Java库。任何客户端,甚至GUI,都可以。只是为了测试,如果遇到同样的麻烦。 WinSCP例如使用SSH_FXP_REALPATH。只需尝试连接并输入/level-1/level-2即可。 (我是WinSCP的作者)

答案 1 :(得分:1)

我找到了JSCH 0.1.49的源代码并对其进行了跟踪。我发现有一个名为_realPath的方法在服务器无法返回realpath时抛出异常。 该方法的输入参数是远程文件夹的绝对路径所以我注释了异常,而是返回了绝对路径。一切正常。

这是修改后的代码。请注意,原始代码大多数时间都在工作,我所做的更改是出于服务器无法在二级目录(子文件夹)上返回realpath的情况,并且无法保证它适用于所有服务器。

//com.jcraft.jsch.ChannelSftp
private byte[] _realpath(String path) throws ... {
...
if (type == SSH_FXP_STATUS) {
  i = buf.getInt();
  /* Some servers fail to return the realPath
   on second level of directory (subfolders).
   original code is commented out and replaced with a return.*/
  //throwStatusError(buf, i);
  return (path.getBytes());
}
...