【问题标题】:File.canRead() returns falseFile.canRead() 返回 false
【发布时间】:2015-09-18 03:02:14
【问题描述】:

我有一个服务器客户端程序,服务器在 Raspberry Pi(运行 Linux)上运行,客户端是 Android 应用程序。我正在编写一个应用程序文件浏览器,它只是向服务器发送一个路径,然后服务器使用file.listFiles()(服务器是用Java编写的)返回文件列表。

我以sudo 运行服务器/Java 程序,希望这样可以访问整个系统的所有文件,但令我惊讶的是,这个用户没有对 Pi 的/home 目录的读取权限。

所以这是按顺序发生的:

我请求file.listFiles(new File("/"));,它通过套接字从 Pi 发送到 Android 应用程序。在应用程序中,在发出下一个请求之前,我检查是否可以使用 file.canRead(); 读取文件,对于 /home 目录,这将返回 false。

Pi 上的文件权限:

pi@raspberrypi ~ $ ls -l / | grep home
drwxr-xr-x   3 root root  4096 Dec 31  1969 home

我如何运行我的 Java 服务器:

pi@raspberrypi ~ $ sudo java -cp "/usr/local/lib/bluecovelib/bluecove/target/bluecove-2.1.1-SNAPSHOT.jar:/usr/local/lib/bluecovelib/bluecove-gpl-2.1.1-SNAPSHOT/target/bluecove-gpl-2.1.1-SNAPSHOT.jar:/home/pi/severinteractionutils.jar:." AppConnect

为什么sudo 用户无权从Java 程序访问/home 目录?

编辑:

我在 Pi 上运行了一个简单的程序来测试是否是因为底层操作系统发生了变化。看来确实有效果。

public class TestFileBrowser {
    public static void main(String[] args) { 
        System.out.println("Hello, World");
        File file = new File("/");
        File [] files = file.listFiles();
        for(int i=0; i<files.length; ++i) {
            if(files[i].getAbsolutePath().equals("/home")) {
                File homeDir = files[i];
                if(homeDir.canRead()) {
                    System.out.println("Can Read");
                    if (homeDir.isDirectory()) {
                        System.out.println("Is directory");
                    }
                }
            }
        }
    }
}

这是控制台快照:

pi@raspberrypi ~ $ sudo javac TestFileBrowser.java 
pi@raspberrypi ~ $ sudo java TestFileBrowser
Hello, World
Can Read
Is directory

【问题讨论】:

    标签: java linux file


    【解决方案1】:

    对于 /home 目录,返回 false。

    正确,因为您无法使用典型的文件流 IO 从目录中读取。您可以致电 File.isDirectory()(根据 Javadoc)

    测试此抽象路径名表示的文件是否为目录。

    如果需要区分I/O异常和文件不是目录的情况,或者同时需要同一文件的多个属性,那么Files.readAttributes方法可以可以使用。

    并且你可以通过属性检查读取权限。

    【讨论】:

    • 那么,在这种情况下如何获取/home 目录的内容。基本上,如何获得一个功能强大的远程文件浏览器。另外,file.isDirectory() 为我返回 false。
    • 那么你就无法获取内容,因为它不是目录。试试new File(System.getProperty("user.home")).listFiles();
    • 我试过了,但是由于我以 sudo 运行程序(由于程序中的其他事情需要它),它返回 /root 作为没有用的主目录。另外,请看ls -l / | grep home的内容有问题,说明它是一个目录
    • 并不意味着非 root 用户会有一个“/home”目录(作为 sudo 运行意味着你可以读取任何存在的目录)。
    • 是的。这就是应该的。我不确定为什么它的行为不同
    猜你喜欢
    • 2010-11-02
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-18
    • 2015-08-02
    • 2012-05-17
    • 2013-10-26
    • 2013-01-06
    相关资源
    最近更新 更多