Java应用程序JBOSS的一些奇怪行为(技术无关…)
应用程序可以访问文件,只有用户拥有,它运行进程。
-rwxrwxrwx。1 root 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拉-rw------- 1 MySuperUser GroupUnix1 308 Jun 3 14:15 output_new.txt <-access ok
任何想法如何访问文件在Java中,这是由组而不是用户拥有的?我在多用户环境下运行。
----rw---- 1 MySuperUser GroupUnix1 308 Jun 3 14:15 output_new.txt access ok ?为什么?
---------- 1 MySuperUser GroupUnix1 308 Jun 3 14:15 output_new.txt access ok ?为什么?
----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)readfile . doget (ReadFile.java:85) javax.servlet.http.HttpServlet.service(HttpServlet.java:734) javax.servlet. httpservlet .service(HttpServlet.java:847)
CODE i try:
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它不能写,作为一个组编辑。
UPDATE: NFS共享发生写入。在NFS之外,它的行为与预期一致。但内部共享-崩溃。
您的问题与Java无关,而是与unix相关。
首先,文件属于用户,而不是组。
其次,您必须了解unix文件权限优先级。系统首先检查用户权限,然后检查组权限,最后检查其他人权限。
例如,给定这个文件:
----rwx--- bob wailers test.txt
- 如果你是用户"bob",你不能读,写或执行它
- ELSE如果你在"wailers"组中,你可以读、写或执行它
所以,如果你是用户"bob",即使你属于"wailers"组:
- 第一个条件为真(你是bob)并且权限适用:你不能访问该文件
但是如果你是用户"peter"并且你属于"wailers"组:
- 第一个条件是false(你不是bob) ->权限不适用,
- 第二个条件为真(您在wailer中)->权限适用:您可以访问文件
你要么需要:
- 使用具有文件读/写权限的用户/帐户启动jboss进程(可能使用sudo)
- 修改文件/目录的访问权限,使jboss进程的用户具有对文件的读写权限(参见chmod)
这是一个相当老的问题,但我遇到了一个类似的问题,最后弄清楚了这个问题,我没有看到任何SO帖子记录了我正在经历的问题。
在我的情况下,我使用Apache Commons FileUtils方法保留日期信息,我认为保留日期信息是导致特定异常"Operation Not allowed"的原因。在其他情况下,如果文件/目录权限不足,我倾向于看到"访问被拒绝";
进一步调试,我发现对于我正在处理的文件系统(我相信是NFS或CIFS),如果我使用cp -p
复制文件,我将得到相同的"操作不允许";由操作系统上报。根据手册页:-p same as --preserve=mode,ownership,timestamps
,所以它会尝试保留时间戳。在我的例子中,我的用户对文件具有组访问权限,但所有者是不同的用户(root
)。我在另一个论坛上看到的:https://serverfault.com/a/680045
在Unix上,时间戳不能保留在用户不拥有的文件上。
因此,即使我的用户具有读取文件/目录的组权限,该命令也会失败,因为无法保留时间戳。
解决方案是更改文件的所有权,以匹配试图执行复制并保留时间戳的用户。
另一种方法可能是使用另一种不尝试保留时间戳的Java复制方法,但我实际上并没有尝试过。