为什么Apache VFS(SFTP)会在不需要时尝试切换到根目录以及如何避免它

时间:2018-02-09 16:17:54

标签: java apache sftp apache-commons-vfs

我正在使用apache VFS将文件上传到sftp服务器。但是一个sftp服务器有一个限制,它的根目录没有任何权限。但是我的应用程序允许的目录是“/ ftp / abc /”。可以使用命令行访问此目录。但Apache VFS首先尝试切换到根目录“/”,由于我的情况下缺少权限而失败。

编辑:userDirIsRoot设置为true可防止vfs切换到根目录。但在这种情况下,我们必须指定相对于用户根目录的路径。这意味着userDirIsRoot为真,否则您无法指定绝对路径。这听起来不对。 是否有一种简单的方法,我们可以使用它来指定绝对路径,而vfs不会尝试切换到基本文件系统的裸根目录。

1 个答案:

答案 0 :(得分:3)

相关的源代码位于getChannel()

中的org.apache.commons.vfs.provider.sftp.SftpFileSystem
Boolean userDirIsRoot = SftpFileSystemConfigBuilder.getInstance().getUserDirIsRoot(getFileSystemOptions());
String workingDirectory = getRootName().getPath();
if (workingDirectory != null && (userDirIsRoot == null || !userDirIsRoot.booleanValue()))
{
    try
    {
        channel.cd(workingDirectory);
    }
    catch (SftpException e)
    {
        throw new FileSystemException("vfs.provider.sftp/change-work-directory.error", workingDirectory);
    }
}

您的案例中的问题是getUserDirIsRoot(getFileSystemOptions()) 评估为真。

  

无论如何都要告诉Apache VFS库不要切换到root   ?目录

为了输入if语句而调用channel.cd(workingDirectory),userDirIsRoot.booleanValue()应该评估为true。

根据documentation,您可以使用SftpFileSystemConfigBuilder设置SftpFileSystem选项。

示例:

SftpFileSystemConfigBuilder
.getInstance()
.setUserDirIsRoot(options, true);