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的主要内容,如果未能解决你的问题,请参考以下文章