Java - 无法创建具有 777 权限的目录(改为具有 775)[重复]
Posted
技术标签:
【中文标题】Java - 无法创建具有 777 权限的目录(改为具有 775)[重复]【英文标题】:Java - unable to create directory with 777 permission (has 775 instead) [duplicate] 【发布时间】:2017-06-12 04:06:02 【问题描述】:我正在尝试创建具有公共写入权限的目录。为了简化事情,我希望它拥有777
权限。这是我的代码:
private static FileAttribute<Set<PosixFilePermission>> DIR_PERMISSIONS;
static
Set<PosixFilePermission> perms = new HashSet<>();
perms.add(PosixFilePermission.OWNER_WRITE);
perms.add(PosixFilePermission.OWNER_READ);
perms.add(PosixFilePermission.OWNER_EXECUTE);
perms.add(PosixFilePermission.GROUP_WRITE);
perms.add(PosixFilePermission.GROUP_READ);
perms.add(PosixFilePermission.GROUP_EXECUTE);
perms.add(PosixFilePermission.OTHERS_WRITE);
perms.add(PosixFilePermission.OTHERS_READ);
perms.add(PosixFilePermission.OTHERS_EXECUTE);
DIR_PERMISSIONS = PosixFilePermissions.asFileAttribute(perms);
private Path ensurePath(LocalDate localDate) throws IOException
String year = String.valueOf(localDate.getYear());
String month = String.format("%02d", localDate.getMonthValue());
Path path = Paths.get(rootDirectory, year, month);
return Files.createDirectories(path, DIR_PERMISSIONS);
对于rootDirectory=/tmp/data
,这应该创建像/tmp/data/2016/01
这样的文件夹,每个文件夹都具有777
权限。相反,文件夹具有775
权限(drwxrwxr-x.),因此它们缺少公共写入。为什么它会这样工作?也许JVM需要特殊的参数才能设置这样的权限?
我的系统是Fedora 24,app是标准的Spring Boot应用,由maven插件启动。
【问题讨论】:
@OlivierGrégoire 这不是重复的,因为这不能解释为什么它会以 775 的形式出现。 @Michael 这里问题的主要部分是“我不能”,而不是“为什么”。另一个主题中接受的答案是完整的,如何解决这个问题。 @OlivierGrégoire “为什么会这样?” 目录是否可能已经存在?如果是这样,Files.createDirectories 将不会使用新权限。 您的 Java 进程正在运行的umask
的值是多少?不会是002
,对吗?
【参考方案1】:
好吧,这让我很好奇,所以这里是:
Google 导致了这个:https://***.com/a/25557947/6768037(“Java 正在设置您寻求的权限,然后它被屏蔽了。”)然后返回到 @OlivierGrégoire 最初提供的链接。 umask 是个严厉的情妇。
Spring Boot 与此行为无关。下面是一个简单的概念证明。我的默认 umask 是 0002。我的 /tmp 目录最初是空的。
public class Test
public static void main(String[] args)
Set<PosixFilePermission> fullPermission = new HashSet<PosixFilePermission>();
fullPermission.add(PosixFilePermission.OWNER_EXECUTE);
fullPermission.add(PosixFilePermission.OWNER_READ);
fullPermission.add(PosixFilePermission.OWNER_WRITE);
fullPermission.add(PosixFilePermission.GROUP_EXECUTE);
fullPermission.add(PosixFilePermission.GROUP_READ);
fullPermission.add(PosixFilePermission.GROUP_WRITE);
fullPermission.add(PosixFilePermission.OTHERS_EXECUTE);
fullPermission.add(PosixFilePermission.OTHERS_READ);
fullPermission.add(PosixFilePermission.OTHERS_WRITE);
Path path = Paths.get("/tmp/data/", "01/26");
try
Files.createDirectories(path, PosixFilePermissions.asFileAttribute(fullPermission));
outputLS(path);
Files.setPosixFilePermissions(path, fullPermission);
outputLS(path);
catch (Exception e)
e.printStackTrace();
private static void outputLS(Path path) throws IOException
System.out.println(new java.util.Scanner(Runtime.getRuntime().exec("ls -alt " + path.toAbsolutePath() + "/..").getInputStream()).useDelimiter("\\A").next());
产量:
total 12
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 .
drwxrwxr-x 2 jsampson jsampson 4096 Jan 26 21:53 26
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 ..
total 12
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 .
drwxrwxrwx 2 jsampson jsampson 4096 Jan 26 21:53 26
drwxrwxr-x 3 jsampson jsampson 4096 Jan 26 21:53 ..
umask 只是负责所有文件/目录创建权限。创建后可以进行更改。
【讨论】:
非常感谢,它正在工作。我想我应该更多地了解 umask。以上是关于Java - 无法创建具有 777 权限的目录(改为具有 775)[重复]的主要内容,如果未能解决你的问题,请参考以下文章
即使文件具有 777 权限,LibreOffice 转换为 pdf 也会产生文件无法加载错误
CentOS 怎么设置某个目录包括子目录的写入权限 777呢