2 votes

J'essaie d'exécuter un processus avec pkexec de manière asynchrone et j'obtiens 'Refusing to render service to dead parents'.

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

Quand j'invoque pkexec de manière 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 sinistre :

Refusing to render service to dead parents.

Vous savez ce qui se passe ?

3voto

Il n'est pas autorisé à exécuter pkexec en arrière-plan par fork et exec, puis en terminant le parent. Le processus devient un 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 depuis un Shell Shell. De cette façon, le parent est un Shell et non pas un init .

Par exemple, GParted ( /usr/bin/gparted-pkexec ) et GameConqueror ( /usr/bin/gameconqueror ), procédez comme suit, comme indiqué ci-dessous :

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

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

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

    Exec=/usr/local/bin/foo.sh
  4. Assurez-vous que votre fichier de politique 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 !

0voto

TinyRickHole Points 1

Regarde ça enlace ça a marché pour moi.

  • Il explique comment installer policykit-1 qui fournit pkexec.

  • explique l'utilisation de l'escalade de privilèges pour l'invite gui su

  • Configuration des alias Bash pour utiliser des alias afin de lancer des programmes sans avoir à taper

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

    application-name

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X