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?
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:
Créez un script Shell en tant que /usr/local/bin/foo.sh
:
#!/bin/sh
pkexec "/usr/sbin/foo" "$@"
Donnez la permission exécutable au script ci-dessus:
chmod +x /usr/local/bin/foo.sh
Si vous utilisez .desktop
fichier, changez la valeur de Exec
comme:
Exec=/usr/local/bin/foo.sh
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!
Découvrez ceci lien cela a fonctionné pour moi.
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