2017-02-18 9 views
0

Я хочу запустить графический интерфейс с правами root. Когда пользователь запускает скрипт, всплывающее окно должно открыть запрос пароля root, а затем открыть GUI. Я знаю, что это можно сделать через pkexec. Но я не знаю, как реализовать pkexec в vala-скрипте. Включение, я хочу запустить мое приложение через разрешения sudo. Может ли кто-нибудь предложить решение для этого?Как запустить pkexec в вала-скрипте?

+0

Возможный дубликат [выполнить часть кода как root] (http://stackoverflow.com/questions/42779843/run-part-of-code-as-root) –

ответ

0

Просто введите код с 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, как обычный и т. д.).

+0

Спасибо за ответ. Возможно, мое приложение elevated_gui_app - это приложение который я получаю после запуска двух сценариев vala (main.vala и main1.vala). Так как вызывать эти сценарии (или приложение после компиляции и запуска двух сценариев) в приведенном выше примере кода? –

+0

Я уточнил свой ответ. Не используйте термин «скрипт» в контексте vala, файлы '.vala' называются« исходными файлами », а результат после компиляции называется« приложение »(или« приложение »для краткости). Чтобы быть на 100% технически правильным, мы должны назвать его «исполняемым». –

+0

Содержимое исходных файлов называется «исходный код» (или «code» для краткости). –