当前一个目录不在根目录(ftp home)中时,JSch的SFTP通道无法更改目录。它仅在某些SFTP服务器上发生,而不是全部发生。
例如,目录结构是:
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
。
答案 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());
}
...