【问题标题】:/usr/local and subfolders are not recognized by my Java program我的 Java 程序无法识别 /usr/local 和子文件夹
【发布时间】:2021-06-18 01:33:23
【问题描述】:

我有一个 64 位 Linux Mint 20.1 操作系统,我意识到我的任意 Java 程序无法将“/usr/local”或其中的任何内容识别为现有实体。为了澄清我的意思,我在下面举了几个例子:

System.out.println(new File("/usr").exists()); //prints true

System.out.println(new File("/usr/local").exists()); //prints false

System.out.println(new File("/usr/local/bin").exists()); //prints false

System.out.println(new File("/usr/local/random-file-1").exists()); 
//prints false, regardless of whether that file exists

我检查了 /usr/local 的权限,假设那里可能有问题,但奇怪的是,我没有发现任何问题:

你能给你两分钱买什么可以变成梨形吗?

【问题讨论】:

    标签: java linux permissions linux-mint


    【解决方案1】:

    与java无关,与你的linux安装有关:

    选项 1:此目录上没有 Unix UGO x 权限。

    进程无法查看/usr 目录。最有可能的是,该进程以用户X 运行,该用户在组[Y] 中(可以是多个!)。

    /usr 目录肯定不归 X 所有(在所有相关的 unix 发行版上,它归 root 所有)。 /usr 的组所有者也很可能是 [Y] 集合中的任何内容;在大多数 linuxen 上,它是组 root,除了 root 本身之外,没有其他用户属于该组。

    因此,访问权限的最后 3 个字母适用(它是用户/组/其他)。因此,运行ls -lah / 并检查/usr 的访问权限。我期望:

    drwxr-xr--  10 root root 4.0K Jan 1   2021 usr
    

    请注意末尾的r--。没有x 意味着甚至没有权利查看它。这可以解释你所看到的。

    请注意,这与 /usr/local 的访问权限无关!要读取目录,您需要访问整个“堆栈”,通常阻止您的目录仍然是,本身,对你可见——只是你不能删除或移动它,不能运行或打开其中的任何东西,甚至不能ls它。因此,您甚至无法“看到”/usr/local 这一事实表明,如果它完全是 UGO 访问,则不是/usr/local,而是/usr/

    选项 2:ACL 覆盖权限

    一些发行版(尤其是 mac OS X)在标准的 unixy 用户/组 + UGO 权限系统之上添加了一层访问权限。例如,在 mac OS 中,您需要转到系统偏好设置窗格并转到“隐私”,并在此处添加一些磁盘访问权限。我不确定薄荷是否有类似的系统。可能不会,尤其是/usr,这是一个相当重要的。

    选项 3:奇怪的东西

    您正在使用不应再使用的过时 Java API。这个 API 的缺点之一是它不能给你关于东西的信息,它只能返回布尔值。因此,请尝试使用新的 API,如果您遇到错误,因为如果您这样做了,它会提供更多帮助:很多:它将有很多文字向您解释:

    (首先检查 /usr/bin/man 是否存在;它应该存在。如果不存在,请选择您在那里找到的任何其他现有东西)。

    import java.nio.file.*;
    
    class Test {
        public static void main(String[] args) throws Exception {
            Path p = Paths.get("/usr/bin/man"); // I assume this exists.
            byte[] b = Files.readAllBytes(p);
            System.out.println("size of man exe: " + b.length);
        }
    }
    

    这会抛出一些东西(或者如果它没有,嘿,还有其他问题,因为这个测试应用程序没有问题!) - 该异常的文本会告诉你一些有用的东西。

    选项 4:呃

    您的磁盘已损坏。让我们希望这不是它:P

    【讨论】:

      猜你喜欢
      • 2015-07-05
      • 2017-05-12
      • 1970-01-01
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      相关资源
      最近更新 更多