当先前目录不在根目录(ftp主目录)中时,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服务器返回/作为根的真实路径 另一个没有失败的服务器返回完整路径列表/usr/account

===============>>#1 票数:1

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

您登录时使用的帐户是chroot吗? 谁进行chrooting,SFTP服务器还是系统级chrooting?

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

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

===============>>#2 票数: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());
}
...

  ask by user2292916 translate from so

未解决问题?本站智能推荐: