如何在vala脚本中运行pkexec?

时间:2017-02-18 14:12:51

标签: ubuntu vala

我想运行具有root权限的GUI。当用户运行脚本时,应打开一个弹出窗口,询问root密码,然后打开GUI。我知道可以通过pkexec来完成。但我不知道如何在vala脚本中实现pkexec。 Inshort,我想通过sudo权限运行我的应用程序。有人可以为此提出解决方案吗?

1 个答案:

答案 0 :(得分: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(应该以root身份运行的可执行文件的代码):

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

当然,您可以更改代码以在本地工作目录中运行它,但以root身份运行是危险的,您应该始终确保运行正确的可执行文件。有些开发人员甚至只允许使用特定的文件名(如/usr/bin/my_elevated_app)。

当您现在运行./my_app时,pkexec会提示您输入密码的GUI,并且在成功进行身份验证后,应启动my_elevated_app进程。

如果一切按预期工作,您应该看到此输出:

$ ./my_app
I am running as a normal user
I am running as root

以上两个应用程序都是控制台应用程序,但同样适用于GUI应用程序(只需像往常一样使用Gtk创建窗口等)。