【问题标题】:Java cant access Files In NFS ShareJava 无法访问 NFS 共享中的文件
【发布时间】:2015-06-04 08:22:55
【问题描述】:

Java 应用 JBOSS 中的一些奇怪行为(与技术无关..)

应用程序可以访问文件,只有用户拥有,运行进程。未使用组。

-rwxrwxrwx。 1 根 GroupUnix1 448 Jun 4 06:26 output_new.txt

id uid=401322(MySuperUser) gid=401322(MySuperGroup) >groups=401322(MySuperGroup),7013595(GroupUnix1) >context=unconfined_u:system_r:openshift_t:s0:c528,c834

getenforce 许可 从第一个角度来看,Java 并不关心文件级权限。只有所有权。

ls -la -rw------- 1 MySuperUser GroupUnix1 308 Jun 3 14:15 output_new.txt

任何想法如何访问属于组而不是用户的 Java 文件?我在 MultiUser 环境中运行。

----rw---- 1 MySuperUser GroupUnix1 308 Jun 3 14:15 output_new.txt 访问好吗?为什么?

--------- 1 MySuperUser GroupUnix1 308 Jun 3 14:15 output_new.txt 访问好吗?为什么?

----rw---- 1 root GroupUnix1 364 Jun 3 14:16 output_new.txt 无法访问?为什么?

来自 JBOSS 的错误。但基本上我的访问受到限制。

错误:java.nio.file.FileSystemException:/mnt/SuperFolder/share1/outbound/output_new.txt:不允许操作 sun.nio.fs.UnixException.translateToIOException(UnixException.java:91) sun.nio.fs .UnixException.rethrowAsIOException(UnixException.java:102) sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) sun.nio.fs.UnixFileAttributeViews$Posix.setMode(UnixFileAttributeViews.java:228) sun.nio.fs .UnixFileAttributeViews$Posix.setPermissions(UnixFileAttributeViews.java:250) java.nio.file.Files.setPosixFilePermissions(Files.java:1992) com.company.soft.eap.test.nfs.ReadFile.doGet(ReadFile.java:85 ) javax.servlet.http.HttpServlet.service(HttpServlet.java:734) javax.servlet.http.HttpServlet.service(HttpServlet.java:847)

我尝试的代码:

String path = "/mnt/SuperFolder/share1/outbound/output_new.txt";
// (use relative path for Unix systems)
File f = new File(path);
// (works for both Windows and Linux)
f.getParentFile().mkdirs();
f.createNewFile();
FileWriter fstream = new FileWriter(path, true);
BufferedWriter outt = new BufferedWriter(fstream);
outt.write(" something \n ");
outt.newLine();
// close buffer writer
outt.close();

所以如果文件有 070 它不能写入,请作为一个组编辑。

更新:写入发生在 NFS 共享上。在 NFS 之外,它的行为符合预期。但内部共享 - 崩溃。

【问题讨论】:

  • 我在FileUtils.copy() 遇到了这个问题,这让我发疯了。我认为这是因为另一个进程正在锁定源文件夹,或者驱动器有一些逻辑错误。
  • 你有没有找到任何根本原因?

标签: java file servlets jboss


【解决方案1】:

您的问题与 Java 无关,而是与 unix 相关。

首先,文件归用户所有,而不是组。

其次,您必须了解 unix 文件权限优先级。系统首先检查用户权限,然后检查组权限,最后检查其他权限。

例如,给定这个文件:

----rwx--- bob wailers test.txt
  1. 如果您是用户“bob”,则无法读取、写入或执行它
  2. ELSE IF 如果您在“wailers”组中,则可以读取、写入或执行它
  3. 否则您将无法读取、写入或执行它

因此,如果您是用户“bob”,即使您在组“wailers”中:

  1. 第一个条件为真(您是 bob)并且权限适用:您无法访问该文件。

但是如果你是用户“peter”并且你在组“wailers”中:

  1. 第一个条件为假(你不是 bob)-> 权限不适用,
  2. 第二个条件为真(您在哀悼者中)-> 应用权限:您可以访问该文件。

【讨论】:

  • 嘿,我知道这一点。所以在我的情况下,我是彼得,我在 Group wailers 中......我无法访问......但是当我写信给 NFSv3 Share 时,它​​可能是 NFS 权限问题......
【解决方案2】:

您需要:

  1. 使用对文件具有读/写权限的用户/帐户启动 jboss 进程(可能使用sudo)
  2. 更改文件/目录的访问权限,使 jboss 进程的用户对文件具有读/写权限(请参阅chmod)

【讨论】:

  • 我有访问权限,并且用户在同一用户下运行。只有用户在组内,并且组有权访问。 ----------。 1 用户 rGroup 168 Jun 4 09:31 output_new.txt 我可以使用 java 访问,因为 java 在用户下运行。但是使用 chmod 777 * 和所有者 root 我可以访问
猜你喜欢
  • 1970-01-01
  • 2017-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-09
  • 2019-02-18
相关资源
最近更新 更多