【问题标题】:Java - unable to create directory with 777 permission (has 775 instead) [duplicate]Java - 无法创建具有 777 权限的目录(改为具有 775)[重复]
【发布时间】: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,对吗?

标签: java file posix nio file-permissions


【解决方案1】:

好吧,这让我很好奇,所以这里是:

Google 导致了这个:https://stackoverflow.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。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 2012-01-17
  • 2012-06-13
  • 2013-07-19
  • 2018-09-07
  • 2018-11-20
  • 1970-01-01
相关资源
最近更新 更多