【问题标题】:Apache commons sftp - go above user home directoryApache commons sftp - 转到用户主目录之上
【发布时间】:2014-08-01 01:42:21
【问题描述】:

我们有一个使用以下约定的服务器:

/pathA/Users/
/pathB/data/

当用户登录时,他们最终会进入相应的 /pathA/Users/user/ 目录,但有时他们需要访问 /pathB/data/ 。我想编写一个浏览器,使用 sftp,让用户浏览服务器的内容(我很高兴找到一个 java 工具,我可以插入我的应用程序,但找不到任何符合我所有要求的东西) . 我遇到的问题是apache-commons-vfs 接受一串表单

sftp://user:password@host 

并使用它登录用户目录并将该目录视为根目录。效果是我无法超越该目录,在相应的FileObject 上调用getParent() 返回null。我知道可以在终端上使用 sftp 跨过用户主目录,所以我猜这是apache-commons-vfs 库施加的限制。有没有人知道我是否可以解决这个问题,以便可以浏览整个服务器?

【问题讨论】:

  • 浏览整个服务器 ...你确定吗?您始终可以通过 SSH 连接到服务器。
  • 我明白你的意思,但我需要访问用户目录之外的一些目录。该应用程序的重点是让那些听到“终端”这个词就开始颤抖的用户的生活更轻松,所以我不希望他们不得不轻拍 ssh。而且我可以从我的代码中使用 ssh 获得我想要的功能,但希望能找到一个可以让我省去编码工作的库。
  • 未来是否有人对此感兴趣:我能够通过 SSHJ's StatefulSFTPClient 获得所需的功能,尽管它的文档有点稀缺,因此有点工作。

标签: java sftp apache-commons apache-commons-vfs


【解决方案1】:

嗯,你确实可以。检查此代码!

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();
        }
    }
}

【讨论】:

  • 哈,我从没想过只尝试绝对路径。聪明。
猜你喜欢
  • 1970-01-01
  • 2015-08-03
  • 2015-01-07
  • 1970-01-01
  • 2010-12-04
  • 2017-11-19
  • 2014-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多