2017-01-26 11 views
6

Я пытаюсь создать каталог с общедоступными правами на запись. Чтобы упростить вещи, я хочу, чтобы у нее были разрешения 777. Вот мой код:Java - не удалось создать каталог с разрешением 777 (вместо него было 775)

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, приложение стандартное приложение Spring Boot, запущенное плагином maven.

+1

@ OlivierGrégoire Это не дубликат, потому что это не объясняет * почему * это выходит как 775. – Michael

+1

@Michael Основная часть вопроса здесь «Я не могу», а не «почему». Принятый ответ в другой теме завершен, как исправить это. –

+0

@ OlivierGrégoire «** Почему ** это работает так?» – Michael

ответ

0

Хорошо хорошо это у меня любопытным так вот:

Google привел к следующему: https://stackoverflow.com/a/25557947/6768037 («Java устанавливает разрешение, которую вы ищете, а затем он маскируется из.»), который затем приводит обратно к ссылку, которую первоначально предоставил @ OlivierGrégoire. umask - суровая хозяйка.

Spring Boot не имеет ничего общего с этим поведением. Ниже приводится простое доказательство концепции. Мой default 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 просто отвечает все файла/каталога создание разрешений. После создания можно внести изменения.

+1

Спасибо, он работает. Думаю, мне нужно больше узнать о umask. – xianoss