我们有一个使用以下约定的服务器:
/pathA/Users/
/pathB/data/
当用户登录时,他们最终在各自的/pathA/Users/user/
目录,但他们有时需要访问/pathB/data/
。我想写一个浏览器,使用sftp,将让用户浏览服务器的内容(我很高兴找到一个java工具,我可以只是插入到我的应用程序,但未能找到任何符合我所有的要求)。我的问题是,apache-commons-vfs
接受形式的字符串
sftp://user:password@host
并使用它登录到用户目录,并且将该目录视为根目录。效果是,我不能跳过这个dir,调用getParent()
对应的FileObject
返回null
。我知道在终端上使用sftp可以跳过用户主目录,所以我猜这是apache-commons-vfs
库施加的限制。有没有人知道我能不能绕过这个问题让整个服务器都能浏览?
其实可以。检查这段代码!
public class Test {
public static void main(String[] args) throws Exception {
FileSystemOptions opts = new FileSystemOptions();
SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(opts, "no");
SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(opts, false);
FileSystemManager fileSystemManager = VFS.getManager();
FileObject fileObject = fileSystemManager
.resolveFile("sftp://user:password@host/",opts);
// foo is under SERVER ROOT not USER's!!!
FileObject temp = fileObject.resolveFile("/foo/faa/frog/");
FileObject fileObjects[] = temp.getChildren();
try {
for (FileObject j : fileObjects) {
System.out.println(j.getName().getBaseName());
j.close();
}
} finally {
fileObject.close();
temp.close();
}
}
}