我想使用root权限运行GUI。当用户运行该脚本时,应该会打开一个询问超级用户密码的弹出窗口,稍后会打开GUI。我知道这可以通过pkexec完成。但是我不知道如何在vala脚本中实现pkexec。简而言之,我想通过sudo权限运行我的应用程序。有没有人能给出一个解决方案?
发布于 2017-02-20 21:28:13
只需从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当然,您可以更改代码以在本地工作目录中运行它,但以root身份运行某些内容是危险的,您应该始终确保您运行的是正确的可执行文件。有些开发人员甚至只允许一个特定的文件名(如/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上述两个应用程序都是控制台应用程序,但同样的事情也应该适用于GUI应用程序(只需像往常一样使用Gtk创建窗口,等等)。
https://stackoverflow.com/questions/42316223
复制相似问题