尽管chmod 777,仍然出现java.io.FileNotFoundException(权限被拒绝)

24

我在编写部署在Tomcat上的Grails应用程序时遇到了一个奇怪的问题。

在创建简单的测试控制器之后,我想在com包中编写测试内容。

package com.domain.controller

import java.io.File;
import java.io.PrintWriter;

class TestController {

        def index() {
                // test
                try {
                        PrintWriter writer = new PrintWriter("/home/user/domains/domain.com/public_html/the-file-name.txt");
                        writer.println("The first line");
                        writer.println("The second line");
                        writer.close();
                } catch (IOException e) {
                        throw new RuntimeException(e);
                }
        }
}

我遇到了一个异常:

 

类 java.io.FileNotFoundException 信息 /home/user/domains/domain.com/public_html/the-file-name.txt (Brak dostępu)

我已将/home/user/domains/domain.com/public_html/的chmod设置为777,并且tomcat7.tomcat7是owner。我还尝试以访问权限777和所有权设置为tomcat7的方式创建此文件,但仍然出现异常:

ls -al /home/user/domains/domain.com/public_html
razem 16
drwxrwxrwx 3 tomcat7 tomcat7 4096 01-08 23:25 .
drwxr-xr-x 8 user    user    4096 12-16 17:14 ..
-rwxrwxrwx 1 tomcat7 tomcat7    0 01-08 23:25 the-file-name.txt

我还需要满足操作系统的哪些条件?

如果有人能够澄清这个问题,我将非常感激。


编辑

我已经在/path1下创建了目录,并设置为777。文件存储得很好。 我还在/path2/testdir下创建了目录,但是path2没有777和chown权限。它仍然可以正常工作。我还测试了testdir目录,包括字符._,也一切正常。

我非常好奇,无法理解这种行为。

</

2
你检查了所有子目录的权限,以确保Java进程的执行者可以访问它们吗? - JustinKSU
@JustinKSU,在之前将所有目录添加+x权限后,一切都正常了。我该如何得到您的正确答案? - Athlan
请告诉我们“Brak dostępu”的意思。我们并不会说所有的语言。本网站使用英语进行交流。这条信息基本上包含了答案。 - user207421
你是否启用了SELinux?你能否检查SELinux审计日志? - Raman
@Athlan 很高兴你解决了它。 - JustinKSU
@Athlan,我添加了一个答案,如果你想给我“信用”的话。 - JustinKSU
6个回答

30

请确保您具有所有父目录的读取和执行许可权限。

例如: chmod o+x /home/user


它可以工作,但我不明白为什么文件的读取权限取决于其父目录的权限。 - Christine
2
Java必须遍历目录才能访问文件。如果无法访问目录,则无法看到该文件。 - JustinKSU
2
使用-R给予子文件夹权限:sudo chmod -R 777 /home/user - Luis Andrés García

6

最终我解决了这个问题。路径中的一个目录没有对其他组拥有可执行权限,正如@JustinKSU所建议的那样,因此无法通过整个路径。

chmod o+x /home/user 解决了问题。


1
我在Jenkins作业构建过程中遇到了这个问题。我已经将jenkins用户添加到tomcat7组,但是当它应该将构件复制到Tomcat实例目录时,Jenkins作业总是失败。
结果发现,解决这个问题所需要的只是重新启动Jenkins服务。

1

当您启用selinux时,可能会出现相同的症状。
您可以使用sestatus检查其状态,并使用setenforce 0禁用它。

这可能在短期内解决您的问题,只需确保它经受得住重新启动的检验。


1

FileNotFoundException出现:

当指定路径名的文件不存在时会出现该异常。如果文件确实存在,但由于某些原因不可访问,例如尝试以只读文件写入的情况,则也会抛出此异常。

文件是存在的,并且根据您发送的内容,它具有写入权限。

在某些情况下,如果另一个程序打开了您尝试进行读写操作的文件,则会发生该错误。使用 lsof | grep the-file-name.txt 查看是否已打开。


1
我确定该文件没有被其他进程使用。我已经通过“lsof”进行了检查,但还是感谢您提供的解决方案,希望它对其他人有用!而且(也是预期的),当我运行应用程序并出现异常时,该文件不会被应用程序触及(在lsof中没有条目)。 - Athlan
1
我非常好奇这可能是什么。当你解决了这个问题,请发布解决方案。 - user987339

1
我是一名有用的助手,可以为您翻译文本。

我使用的是虚拟机6.1和macOS Catalina 10.15.5。

在我的情况下,我需要添加-R标志。 chmod -R o+x /home/user


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接