web-dev-qa-db-ja.com

pkexecを使用して非同期でプロセスを実行し、「死んだ親にサービスを提供することを拒否する」を取得しようとしています

pkexecを使用して通常の権限で実行するアプリケーションからrootとしてプロセスを実行しようとしています。

pkexecを同期的に呼び出すと、すべてうまくいきますが、次のコードで非同期に実行すると、

    private void execute_process_async () {

        if (permission.allowed ) {
            ...

            Pid child_pid;
            var cli = "%s/my_exec".printf (Build.PKGDATADIR);
            try {

                Process.spawn_async (null,
                    {   "pkexec", cli,
                        settings.scrollbar_width.to_string (),
                        settings.scrollbar_button_radius.to_string (),
                        settings.active_tab_underline_color
                    },
                    Environ.get (),
                    SpawnFlags.SEARCH_PATH,
                    null,
                    out child_pid);
            } catch (SpawnError e) {
                report_error ("error while executing '%s'. Message: '%s'.".printf (cli, e.message)) ;
            }
        }
    }

かなり厳しいエラーメッセージが表示されます。

Refusing to render service to dead parents.

何が起こっているか知っていますか?

1
Name is carl

Forkとexecを使用してバックグラウンドでpkexecを実行し、親を終了することはできません。プロセスは孤立し、init(ppid == 1)に属します。 https://lists.ubuntu.com/archives/foundations-bugs/2012-July/100103.html を参照してください。

別のユーザー(通常はroot)にアプリケーションの制御権を与えます。デフォルトの方法は、シェルスクリプトからrootとしてpkexecを使用してアプリケーションを実行することです。このように、親はinitではなくシェルです。

例: GParted(/usr/bin/gparted-pkexec)とGameConqueror(/usr/bin/gameconqueror)は、次のようにこのようにします。

  1. シェルスクリプトを/usr/local/bin/foo.shとして作成します。

    #!/bin/sh
    pkexec "/usr/sbin/foo" "$@"
    
  2. 上記のスクリプトに実行権限を付与します。

    chmod +x /usr/local/bin/foo.sh
    
  3. .desktopファイルを使用している場合は、Execの値を次のように変更します。

    Exec=/usr/local/bin/foo.sh
    
  4. GUIを許可するには、/usr/share/polkit-1/actions/のポリシーファイルに次のエントリがあることを確認してください。

    <annotate key="org.freedesktop.policykit.exec.allow_gui">TRUE</annotate>
    

それでおしまい!

これをチェックしてくださいリンクうまくいきました。

  • Pkexecを提供するpolicykit-1のインストール方法について説明します。
  • gui su Prompt特権エスカレーションの使用法を説明します
  • 入力せずにエイリアスを使用してプログラムを実行するためのBashエイリアスのセットアップ

    pkexec application-name
    
  • 代わりに、エイリアス(アプリケーション名)になります。

    application-name
    
0
TinyRickHole