Мне нужно дать суперпользователю Java-приложение для просмотра защищенных файлов на Mac - PullRequest
2 голосов
/ 14 сентября 2011

Как указано выше.Я искал в Интернете, я также позвонил в поддержку Mac и раздражал гения Mac (OSX Lion) (из отчаяния).Я понятия не имею, как это сделать, я действительно не хочу сидеть на терминале и давать ему команды.Кто-нибудь сталкивался с этим или нашел решение?

Ответы [ 3 ]

10 голосов
/ 14 сентября 2011

Попробуйте посмотреть библиотеку Грега Герена AuthKit . Это библиотека для Mac, которая включает Службы авторизации Mac OS X .

Вот пример:

import glguerin.authkit.*;

Privilege priv = new Privilege("system.privilege.admin");
Authorization auth = new MacOSXAuthorization();

try
{
  // This will cause an authentication prompt to be
  // shown to the user, requesting the "system.privilege.admin"
  // privilege.
  auth.authorize(priv, true);

  // If we reach this point, we can execute privileged programs.

  // Load the secured file.
  Process proc = auth.execPrivileged(new String[] { "/bin/cat", "/root/securefile" });
  InputStream inputStream = proc.getInputStream();

  // Use standard I/O mechanisms to read the input.
}
catch (UnauthorizedCancellation e)
{
  // User chose not to authorize the application.
  // Handle appropriately.
}

Вызов auth.authorize() вызовет стандартный диалог «Пожалуйста, введите ваш пароль, чтобы программа X могла вносить изменения». Пользователь может отменить при желании, вызывая бросок glguerin.authkit.UnauthorizedCancellation.

screen shot of Mac OS X authorization prompt

Это решение имеет огромное преимущество перед использованием sudo или setuid: оно только запускает необходимых задач от имени пользователя root.

Последнее замечание: загрузчик JNI по умолчанию для AuthKit использует мост Какао / Java, который был удален из Mac OS X со Snow Leopard. Таким образом, в последних версиях Mac OS X приведенный выше код завершится с UnsatisfiedLinkError. Чтобы обойти это, используйте следующее:

// Put this class somewhere:
public class AuthKitLibLoader extends LibLoader
{
  @Override
  protected File makeFallbackDir()
  {
    return new File(".");
  }
}

// Then, before calling AuthKit (using the above example), do this:

// Hook in our "Snow Leopard-safe" extension to AuthKit (see below).
System.setProperty("glguerin.util.LibLoader.imp", AuthKitLibLoader.class.getName());

Наконец, обязательно прочитайте документацию AuthKit для получения более подробной информации.

3 голосов
/ 14 сентября 2011

Если вы запустите приложение от имени пользователя root, приложение будет иметь полный доступ ко всему.

Это опасная операция, однако, потому что она дает приложению полные права .

Другой вариант - запустить его как пользователь с необходимыми правами доступа к рассматриваемым файлам. Это можно сделать, поместив пользователя или файлы в соответствующую группу.

0 голосов
/ 14 сентября 2011

Возможно, вам нужно настроить приложение для пользователя root.

> su
Enter password:
> chown root:wheel myJavaApp
> chmod ug+s myJavaApp
> exit

Теперь, когда кто-то из группы wheel запускает myJavaApp, он запускается как его владелец (root). Просто убедитесь, что вы в группе колес (или любой другой группе)

В качестве альтернативы, вы можете chmod a + s myJavaApp ... но это позволит ВСЕМ ВСЕ запустить программу от имени root Я бы тщательно об этом подумал.

...