2017-02-18 68 views
0

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

+0

可能重复[运行部分代码作为根](http://stackoverflow.com/questions/42779843/run-part-of-code-as-root) –

回答

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(为应作为根运行可执行代码):

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 

当然,你可以改变的代码在本地工作目录中运行,但运行的是作为根是很危险的,你应该始终确保您正在运行正确的可执行文件。一些开发者甚至只允许一个特定的文件名(如/usr/bin/my_elevated_app)。

当您现在运行时,应该通过pkexec提示您输入密码并在成功验证后应启动my_elevated_app进程。

如果一切都按预期你会看到这样的输出:

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

以上两种应用的是控制台应用程序,但同样的事情应该GUI工作的应用程式以及(刚创建的Gtk您的Windows作为通常等)。

+0

感谢您的answering.Apparently我的elevated_gui_app是应用程序我在运行两个vala脚本(main.vala和main1.vala)后得到的。那么,如何在上面的示例代码中调用这些脚本(或编译并运行这两个脚本后的应用程序)? –

+0

我澄清了我的答案。请不要在vala的上下文中使用术语'script','.vala'文件被称为'源文件',编译后的结果称为'application'(或简称'app')。好的,在技术上是100%正确的,我们应该把它称为'可执行文件'。 –

+0

源文件的内容称为“源代码”(简称“代码”)。运行'。/ my_app'时出现错误 –