【发布时间】:2017-02-22 22:36:42
【问题描述】:
我想运行具有 root 权限的 GUI。当用户运行脚本时,应该打开一个弹出窗口询问 root 密码,然后应该打开 GUI。我知道可以通过 pkexec 来完成。但我不知道如何在 vala 脚本中实现 pkexec 。简而言之,我想通过 sudo 权限运行我的应用程序。任何人都可以为此提出解决方案吗?
【问题讨论】:
我想运行具有 root 权限的 GUI。当用户运行脚本时,应该打开一个弹出窗口询问 root 密码,然后应该打开 GUI。我知道可以通过 pkexec 来完成。但我不知道如何在 vala 脚本中实现 pkexec 。简而言之,我想通过 sudo 权限运行我的应用程序。任何人都可以为此提出解决方案吗?
【问题讨论】:
只需从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 创建窗口等)。
【讨论】:
script,.vala 文件称为source files,编译后的结果称为application(或简称app)。好吧,要在技术上 100% 正确,我们应该称之为 executable。
source code(或简称code)。
./my_app 时出错。这是error。正如你所说,我正在从 main.vala 拨打gui_app。