Я хочу запустить графический интерфейс с правами root. Когда пользователь запускает скрипт, всплывающее окно должно открыть запрос пароля root, а затем открыть GUI. Я знаю, что это можно сделать через pkexec. Но я не знаю, как реализовать pkexec в vala-скрипте. Включение, я хочу запустить мое приложение через разрешения sudo. Может ли кто-нибудь предложить решение для этого?Как запустить pkexec в вала-скрипте?
ответ
Просто введите код с GLib.Process.spawn_async и измените его, чтобы запустить my_elevated_app
.
main.vala
(Код для исполняемого файла, который должен запустить как обычный пользователь):
public static int main (string[] args) {
stdout.printf ("I am running as a normal user\n");
MainLoop loop = new MainLoop();
try {
string[] spawn_args = {"pkexec", "elevated_app", "arg1", "arg2"};
string[] spawn_env = Environ.get();
Pid child_pid;
Process.spawn_async ("/",
spawn_args,
spawn_env,
SpawnFlags.SEARCH_PATH | SpawnFlags.DO_NOT_REAP_CHILD,
null,
out child_pid);
ChildWatch.add (child_pid, (pid, status) => {
// Triggered when the child indicated by child_pid exits
Process.close_pid (pid);
loop.quit();
});
loop.run();
} catch (SpawnError e) {
stdout.printf ("Error: %s\n", e.message);
}
return 0;
}
elevated_main.vala
(Код для исполняемого файла, который должен запустить как корень):
public static int main (string[] args) {
stdout.printf ("I am running as root\n");
return 0;
}
компилировать два исполняемых файла, как обычно:
valac -o my_app main.vala
valac -o my_elevated_app elevated_main.vala
Обратите внимание, что с в приведенном выше коде вам необходимо сначала установить повышенный исполняемый файл (т. к /usr/local/bin/
или /usr/bin/
или любой другой директории в вашей среде PATH), например:
sudo install -m 755 my_elevated_app /usr/local/bin
Конечно, вы могли бы изменить код, чтобы запустить его в локальном рабочем каталоге, но работает что-то, как корень опасно, вы должны всегда убедитесь, что у вас работает правильный исполняемый файл. Некоторые разработчики даже доходят до определенного имени файла (например, /usr/bin/my_elevated_app
).
Когда вы сейчас запустите ./my_app
, вы должны получить запрос от pkexec
с графическим интерфейсом, чтобы ввести пароль, и после успешной проверки необходимо запустить процесс my_elevated_app
.
Если все работает, как ожидалось, вы должны увидеть этот вывод:
$ ./my_app
I am running as a normal user
I am running as root
Оба указанных выше приложений являются консольные приложения, но то же самое должно работать для приложений с графическим интерфейсом, а также (только создавать окна с Gtk, как обычный и т. д.).
Спасибо за ответ. Возможно, мое приложение elevated_gui_app - это приложение который я получаю после запуска двух сценариев vala (main.vala и main1.vala). Так как вызывать эти сценарии (или приложение после компиляции и запуска двух сценариев) в приведенном выше примере кода? –
Я уточнил свой ответ. Не используйте термин «скрипт» в контексте vala, файлы '.vala' называются« исходными файлами », а результат после компиляции называется« приложение »(или« приложение »для краткости). Чтобы быть на 100% технически правильным, мы должны назвать его «исполняемым». –
Содержимое исходных файлов называется «исходный код» (или «code» для краткости). –
Возможный дубликат [выполнить часть кода как root] (http://stackoverflow.com/questions/42779843/run-part-of-code-as-root) –