запросить права root у java для перезапуска сервисов systemctl - PullRequest
0 голосов
/ 18 мая 2018

Я пишу приложение, которое меняет IP-адрес в Windows и Ubuntu.Мне нужно запустить некоторые команды в терминале от имени пользователя root, поэтому мне нужно вызвать диалоговое окно собственного Ubuntu (и других дистрибутивов Linux), которое дает привилегию root после ввода пароля root.

Как я могу вызвать это диалоговое окно?screenshot of dialog from ubuntu

Вот команда, которую мне нужно запустить как пользователь root от Java-кода, может быть, она может помочь.

ProcessBuilder builder = new ProcessBuilder("/bin/bash",
                        "-c",
                        "systemctl restart networking")
                        .redirectErrorStream(true);

1 Ответ

0 голосов
/ 18 мая 2018

Для начала, процедура отличается для Windows и Ubuntu, поэтому я остановлюсь на Ubuntu.Если ожидается, что ваше приложение будет работать на кроссплатформенном уровне, вам может потребоваться сначала выполнить какую-то идентификацию системы.Затем вы можете применить StrategyPattern в коде для обработки различных способов, позволяющих вашему приложению получить права root или права администратора

Как я понимаю, ваша конечная цель - выполнить команду как root, и в этом случае есть несколько способов.с этой целью

1) Вы можете запустить свое Java-приложение от имени root .Это будет означать, что Приложение может быть выполнено только пользователем root.Это особенно полезно, потому что пользователь root может быть недоступен по той или иной причине, и вы можете позволить пользователю справиться с этой проблемой.Это должно быть примерно так:

sudo java -jar myapp.jar

2) Используйте 'sudo' с ключом '-S' и введите passпароль пользователя к процессу stdin .Это требует, чтобы пользователь был зарегистрирован в файле конфигурации sudoers с разрешениями, установленными для выполнения выполняемой команды.Это может означать, что вы передаете пароль в качестве аргумента приложению во время запуска.

3) Используйте «gksudo», который автоматически вызывает диалоговое окно с паролем .Это также требует, чтобы пользователь был зарегистрирован в файле конфигурации sudoers и, конечно же, доступно «gksudo».Для этого метода это будет выглядеть примерно так:

String[] command = {"gksudo", "systemctl restart networking"};
Process p = Runtime.getRuntime().exec(command);
...