Apache VFS(SFTP)为何默认切换根目录?无权限场景下如何规避?
解决Apache VFS访问受限SFTP目录的权限问题
我之前也碰到过完全一样的坑!当SFTP服务器把根目录/的权限锁死,只开放/ftp/abc/这类特定子目录时,Apache VFS默认先切换到根目录的行为直接就会触发权限错误。你提到的userDirIsRoot确实是解决这个问题的核心开关,接下来我把完整的配置步骤和注意事项给你理清楚:
第一步:开启
userDirIsRoot禁用根目录切换
在构建SFTP的FileSystemOptions时,把这个参数设为true,这样VFS就不会再尝试去访问服务器的根目录/了。代码示例如下:FileSystemOptions sftpOpts = new FileSystemOptions(); SftpFileSystemConfigBuilder.getInstance().setUserDirIsRoot(sftpOpts, true);第二步:调整SFTP路径的写法
开启userDirIsRoot后,VFS会把SFTP服务器分配给你的用户默认工作目录当作自己的根路径。如果你的用户默认目录正好就是/ftp/abc/,那你直接用简化的地址就行:sftp://your-username:your-password@sftp-host/要是你需要直接操作
/ftp/abc/下的子目录,比如/ftp/abc/uploads/,就写成相对路径:sftp://your-username:your-password@sftp-host/uploads/这里不需要写完整的绝对路径,因为VFS已经把
/ftp/abc/当成了根。特殊情况:用户默认目录不是
/ftp/abc/怎么办?
如果服务器给你的默认工作目录不是目标目录,那得额外指定defaultDirectory,强制VFS把/ftp/abc/当作根路径:SftpFileSystemConfigBuilder.getInstance().setDefaultDirectory(sftpOpts, "/ftp/abc/");把这个配置和
userDirIsRoot=true结合起来,就能彻底让VFS在/ftp/abc/这个权限范围内操作,再也不会碰无权限的根目录了。验证配置是否生效
可以写一段简单的代码验证下,比如列出目标目录的内容,确认没有权限错误:FileSystemManager vfsManager = VFS.getManager(); FileObject remoteDir = vfsManager.resolveFile("sftp://your-username:your-password@sftp-host/", sftpOpts); // 尝试列出目录内容,正常返回说明配置生效 FileObject[] files = remoteDir.getChildren(); for (FileObject file : files) { System.out.println(file.getName().getBaseName()); }
内容的提问来源于stack exchange,提问作者Aqeel Ashiq
相关产品推荐
相关产品推荐

