2017-02-18 69 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'時出現錯誤 –