我想设置一个(unix)所有者和一个用Java创建的文件组。我想要this:
UserControl
- 这是一个如何设置权限的示例,但我找不到如何对所有者/组执行相同操作。
请注意,在创建文件之后我不想更改所有者(这已在SO [1] [2]上得到解答),但 创建文件时。
这个问题的动机是我需要确保在我设置适当的所有者和权限时,我正在创建的文件未被其他用户修改。
答案 0 :(得分:2)
似乎无法设置文件创建的所有权。当您查看open()
system call的文档时,它描述了如何设置文件权限,但唯一提及的是所有者:
如果文件不存在,则会创建该文件。文件的所有者(用户ID)设置为进程的有效用户ID。组所有权(组ID)设置为进程的有效组ID或父目录的组ID
另见this answer。
我最终采用的解决方案是:
使用默认所有者创建文件但限制性权限000
:
Path file = ...;
Set<PosixFilePermission> perms = Collections.<PosixFilePermissions>emptySet();
FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);
Files.createFile(file, attr);
将所有者/组更改为目标用户
这应确保其他任何用户都无法在任何时间修改文件。
答案 1 :(得分:1)
Oracle-Documentation描述了如何设置和获得posix一致性所有者。
Path path = ...
UserPrincipalLookupService lookupService =
provider(path).getUserPrincipalLookupService();
UserPrincipal joe = lookupService.lookupPrincipalByName("joe");
Files.setOwner(path, joe);
功能原型如下所示:
public static Path setOwner(Path path,
UserPrincipal owner)
throws IOException
<强>参数强>:
path
- 用于查找文件的文件引用owner
- 新文件所有者文档中确实没有提到该组:
检索文件的组所有者
File originalFile = new File("original.jpg"); // just as an example
GroupPrincipal group = Files.readAttributes(originalFile.toPath(), PosixFileAttributes.class, LinkOption.NOFOLLOW_LINKS).group();
设置文件的组所有者
File targetFile = new File("target.jpg");
Files.getFileAttributeView(targetFile.toPath(), PosixFileAttributeView.class, LinkOption.NOFOLLOW_LINKS).setGroup(group);