2

当上一个目录不在根目录(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 服务器/作为root的真实路径返回。没有失败的另一台服务器返回完整路径列表/usr/account

4

2 回答 2

1

对我来说,我看起来像是服务器端问题/错误。服务器可能会错误地执行SSH_FXP_REALPATH请求。

您登录的帐户是否已 chroot?谁执行 chroot,SFTP 服务器还是系统级 chroot?

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

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

于 2013-04-18T06:24:32.827 回答
1

我找到了 JSCH 0.1.49 的源代码并对其进行了跟踪。我发现有一个名为 _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());
}
...
于 2013-04-18T16:43:31.853 回答