当前一个目录不在根目录(ftp home)中时,JSch 的 SFTP channel 无法更改目录。它仅发生在某些 SFTP 服务器上,而不是所有服务器上。
例如目录结构是这样的:
- /
- 1 级
- 2 级
- 2 级
- 1 级
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
。
最佳答案
我找到了 JSCH 0.1.49 的源代码并追踪了它。我发现有一个名为 _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());
}
...
关于sftp - JSCH (SFTP) 在子文件夹级别(第二级别)更改目录时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16072175/