java.nio.file.Files.setOwner() не допускается

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

Когда он запускается в первый раз в любой день, serve.java создаст новый текстовый файл в указанном каталоге в моей учетной записи, а затем добавит имя пользователя, который запускал программу, в файл (в настоящее время он просто добавляет первый аргумент Программа для файла, но я надеюсь изменить его, чтобы он был более точным, и никто не может дать ложное имя пользователя), тем самым составляя список студентов.

Например, работает:

>> java attend desadams cheesecake

примет заданный пароль "чизкейк" и, если он совпадает с паролем дня, создаст новый текстовый файл с именем "(сегодняшняя дата).txt" и запишет в него имя пользователя "desadams" (если он запускается впервые в этот день) или просто добавьте имя пользователя "desadams" в существующий файл "(сегодняшняя дата).txt".

Я написал свой собственный метод createFile(), который использует пакет java.nio.file для создания файла с пользовательскими разрешениями:

  public static void createFile(File file) throws IOException{
    Path newFile = file.toPath();

    //create new file and set permissions
    /* For the purposes of this program, the new file (the attendance list) must readable and writable to everbody
     * in order for this program to work properly when run from their user, because this program both reads and modif\
ies.
     */
    Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrw-rw-");
    Files.createFile(newFile);
    Files.setPosixFilePermissions(newFile, perms);

    //set owner
    UserPrincipal owner = newFile.getFileSystem().getUserPrincipalLookupService().lookupPrincipalByName("desadams");
    Files.setOwner(newFile, owner);

    //set group
    GroupPrincipal group = newFile.getFileSystem().getUserPrincipalLookupService().lookupPrincipalByGroupName("studen\
ts");
    Files.getFileAttributeView(newFile, PosixFileAttributeView.class).setGroup(group);
  }

Я не смог создать файл и установить права доступа одновременно, потому что мешал umask учетной записи, поэтому я сделал это в два этапа, и он работает нормально.

Теперь мы подошли к моей проблеме: я могу прекрасно скомпилировать и запустить эту программу из своей учетной записи, но в ожидании запуска ее из других учетных записей я изменил метод setOwner(), чтобы использовать произвольное имя пользователя вместо своего собственного, чтобы лучше имитировать условия запуска программы с другого аккаунта. И это не удалось. Попытка установить владельца кем-либо, кроме человека, запускающего программу, приводит к ошибке "операция не разрешена".

Я уже знал, что команда chown UNIX не будет работать, потому что ни одна из сетевых учетных записей не имеет доступа к корневой учетной записи, но я не ожидал, что это помешает Java делать то же самое, хотя я полагаю, что это имеет смысл.

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

Спасибо, и извините, это был длинный пост.

1 ответ

Если пользователи являются пользователями sudoers в вашей системе, вы могли бы их сделать sudo java attend desadams cheesecake, Тем не менее, я ожидаю, что они не sudoers, и, следовательно, ваше решение, где вы сначала создаете файл, вероятно, является лучшим.

Другие вопросы по тегам