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)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

linux cp命令显示无法创建普通文件,权限不够

即使文件具有 777 权限,LibreOffice 转换为 pdf 也会产生文件无法加载错误

CentOS 怎么设置某个目录包括子目录的写入权限 777呢

使用 .net 核心控制台应用程序创建具有 777 权限的文件

为啥PHP不能创建777权限的目录?

wordpress 无法安装插件,不一定因为777权限,可能是用户组的问题