web-dev-qa-db-fra.com

Essayer d'exécuter un processus avec pkexec de manière asynchrone et obtenir «Refuser de rendre le service aux parents décédés»

J'essaie d'exécuter un processus en tant que root à partir de mon application qui s'exécute avec des privilèges réguliers en utilisant pkexec.

Lorsque j'appelle pkexec de façon synchrone, tout va bien, mais lorsque je l'exécute de manière asynchrone avec le code suivant:

    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)) ;
            }
        }
    }

Je reçois un message d'erreur plutôt sombre:

Refusing to render service to dead parents.

Savez-vous ce qui se passe?

1
Name is carl

Il n'est pas autorisé d'exécuter pkexec en arrière-plan par fork et exec, puis de terminer le parent. Le processus devient orphelin et appartient à init (ppid == 1). Voir https://lists.ubuntu.com/archives/foundations-bugs/2012-July/100103.html .

Vous donnez le contrôle d'une application à un autre utilisateur (généralement root). La méthode par défaut consiste à exécuter l'application avec pkexec en tant que root à partir d'un script Shell. De cette façon, le parent est un Shell et non init.

Par exemple. GParted (/usr/bin/gparted-pkexec) et GameConqueror (/usr/bin/gameconqueror) faites-le comme suit:

  1. Créez un script Shell en tant que /usr/local/bin/foo.sh:

    #!/bin/sh
    pkexec "/usr/sbin/foo" "$@"
    
  2. Donnez la permission exécutable au script ci-dessus:

    chmod +x /usr/local/bin/foo.sh
    
  3. Si vous utilisez .desktop fichier, changez la valeur de Exec comme:

    Exec=/usr/local/bin/foo.sh
    
  4. Assurez-vous que votre fichier de stratégie dans /usr/share/polkit-1/actions/ a l'entrée suivante pour autoriser l'interface graphique:

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

C'est ça!

3

Découvrez ceci lien cela a fonctionné pour moi.

  • Il explique comment installer policykit-1 qui fournit pkexec.
  • explique l'utilisation de gui su Prompt escalade de privilèges
  • Configuration d'alias Bash pour utiliser des alias pour exécuter des programmes sans avoir à taper

    pkexec application-name
    
  • Au lieu de cela, il devient alias (nom-application):

    application-name
    
0
TinyRickHole