java.io.FileNotFoundException(权限被拒绝)尽管 chmod 777

Posted

技术标签:

【中文标题】java.io.FileNotFoundException(权限被拒绝)尽管 chmod 777【英文标题】:java.io.FileNotFoundException (permission denied) despite chmod 777 【发布时间】:2014-01-27 08:09:45 【问题描述】:

我在编写部署在 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(布拉克 dostępu)

我已将 chmod 设置为 777 到 /home/user/domains/domain.com/public_html/tomcat7.tomcat7 是所有者。我还尝试使用访问权限 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,也可以。

我非常善于调查,无法理解这种行为。

【问题讨论】:

你检查了所有子目录的权限,确保Java进程的执行者可以访问所有子目录吗? @JustinKSU,在之前将 +x 添加到所有目录之后,一切正常。我怎样才能给你正确的答案? 请告诉我们“Brak dostępu”是什么意思。我们并不都会说所有语言。本网站以英文进行。这条消息基本上包含了答案。 你启用了 selinux 吗?你能检查一下 selinux 的审计日志吗? @Athlan 很高兴你知道了。 【参考方案1】:

确保您还具有对所有父目录的读取和执行权限。

示例: chmod o+x /home/user

【讨论】:

它有效,但我不明白为什么文件的读取权限取决于其父目录的权限。 Java 必须遍历目录才能找到文件。如果它无法到达目录,那么它将看不到文件。 使用 -R 授予子文件夹权限:sudo chmod -R 777 /home/user【参考方案2】:

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

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

【讨论】:

【参考方案3】:

FileNotFoundException 出现:

当具有指定路径名的文件不存在时。它还将 如果文件确实存在但对于某些 原因是不可访问的,例如当试图打开一个 用于写入的只读文件。

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

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

【讨论】:

我确定该文件没有被其他进程使用。我已经通过lsof 进行了检查,但是感谢您的解决方案,希望它对其他人有用!更重要的是(和预期的),当我运行应用程序并发生异常时,应用程序没有触及文件(lsof 中没有条目)。 我很好奇它可能是什么。当您解决此问题时发布解决方案。【参考方案4】:

我在 Jenkins 工作的构建过程中遇到了这个问题。我已将 jenkins 用户添加到 tomcat7 组,但 ​​Jenkins 作业在应该将工件复制到 Tomcat 实例目录时失败。

原来解决这个问题我只需要重启 Jenkins 服务。

【讨论】:

【参考方案5】:

激活selinux 时出现相同的症状 您可以使用 sestatus 检查状态并使用 setenforce 0 禁用它 它可能会在短期内解决您的问题,只要确保它是重启证明。

【讨论】:

【参考方案6】:

我使用的是 virtual box 6.1 和 macOS Catalina 10.15.5。

就我而言,我需要添加-R 标志。 chmod -R o+x /home/user

【讨论】:

以上是关于java.io.FileNotFoundException(权限被拒绝)尽管 chmod 777的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中解码 jpeg