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