2015-08-06 2 views
0

Я хотел бы установить (unix) владельца и группу файла, созданного с Java. Я хотел бы что-то вроде this:Как установить владельца файла/группу при создании файла в Java

Path file = ...; 
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxr-x---"); 
FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms); 
Files.createFile(file, attr); 

- это пример того, как установить права доступа, но я не могу найти, как сделать то же самое с владельцем/группой.

Пожалуйста, обратите внимание, что я не заинтересован в изменении владельца после создан файл (это уже есть ответ на SO [1][2]), но когда файл создается.

Мотивация по этому вопросу заключается в том, что мне нужно убедиться, что создаваемый мной файл не изменяется другими пользователями, когда я устанавливаю надлежащего владельца и разрешения.

ответ

2

Настройка права собственности на создание файла не кажется возможно. Когда вы смотрите на документацию open() system call, он описывает, как установить права доступа к файлам, но только упоминание собственника:

Если файл не существует, он будет создан. У владельца (идентификатора пользователя) файла установлен эффективный идентификатор пользователя процесса. Групповое владение (идентификатор группы) устанавливается либо на идентификатор эффективной группы процесса, либо на идентификатор группы родительского каталога.

См. Также this answer.

Решение, которое я пошел в конце концов, был таков:

  1. Создайте файл с владельцем по умолчанию, но ограничительные разрешения 000:

    Path file = ...; 
    Set<PosixFilePermission> perms = Collections.<PosixFilePermissions>emptySet(); 
    FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms); 
    Files.createFile(file, attr); 
    
  2. Изменение владельца/группы для конечного пользователя

  3. Затем целевой пользователь устанавливает разрешения на то, что ему нужно.

Это должно гарантировать, что ни один другой пользователь не сможет изменить файл в любой момент времени.

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); 
+1

Спасибо за ответ, я буду использовать его, если не найду другое решение. Но это не задает владельца при создании файла *, правильно? Я считаю, что 'Files.setOwner()' ожидает, что файл уже существует. – Mifeet

Смежные вопросы