【问题标题】:How to run pkexec in a vala script?如何在 vala 脚本中运行 pkexec?
【发布时间】:2017-02-22 22:36:42
【问题描述】:

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

【问题讨论】:

标签: ubuntu vala


【解决方案1】:

只需从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 创建窗口等)。

【讨论】:

  • 感谢您的回答。显然我的提升的_gui_app是我在运行两个vala脚本(main.vala和main1.vala)后得到的应用程序。那么,如何调用这些脚本(或编译和运行后的应用程序)上面的示例代码中的两个脚本)?
  • 我已经澄清了我的答案。请不要在 vala 的上下文中使用术语script,.vala 文件称为source files,编译后的结果称为application(或简称app)。好吧,要在技术上 100% 正确,我们应该称之为 executable。
  • 源文件的内容称为source code(或简称code)。
  • 运行 ./my_app 时出错。这是error。正如你所说,我正在从 main.vala 拨打gui_app。
  • 这些是显示服务器相关的错误,看askubuntu.com:askubuntu.com/questions/871092/…
猜你喜欢
  • 1970-01-01
  • 2017-08-04
  • 1970-01-01
  • 2017-02-23
  • 2015-06-12
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
相关资源
最近更新 更多