2010-03-08 11 views
10

J'ai une application d'interface utilisateur (utilise GTK) pour Linux qui doit être exécutée en tant que root (elle lit et écrit/dev/sd *). Au lieu de demander à l'utilisateur d'ouvrir un shell racine ou d'utiliser manuellement "sudo" chaque fois qu'il lance mon application, je me demande si l'application peut utiliser une API fournie par le système d'exploitation pour obtenir les permissions root. (Remarque: l'application gtk ne peut pas utiliser le mode "setuid", donc ce n'est pas une option ici.)Authentification de l'application GTK pour exécuter des autorisations root

L'avantage ici serait un workflow plus simple: l'utilisateur pourrait, à partir de son compte utilisateur par défaut, double-cliquer sur mon application depuis le bureau au lieu d'avoir à ouvrir un terminal racine et le lancer à partir de là. Je demande cela parce que OS X offre exactement ceci: Une application peut demander au système d'exploitation de lancer un exécutable avec des permissions root - le système d'exploitation (et non l'application) demande alors à l'utilisateur d'entrer ses informations d'identification, les vérifie puis les lance la cible comme désiré.

Je me demande s'il y a quelque chose de similaire pour Linux (Ubuntu, par exemple)

Précision:

Ainsi, après l'allusion à PolicyKit Je me demande si je peux l'utiliser pour obtenir r/w l'accès aux périphériques de bloc "/ dev/sd ...". Je trouve la documentation assez difficile à comprendre, alors j'ai d'abord demandé si cela était possible avant de passer des heures à essayer de le comprendre en vain.

Mise à jour:

L'application est un outil de réparation de disque à commande à distance pour l'utilisateur unsavvy Linux, et les noobs Linux n'aura pas beaucoup de compréhension de l'utilisation sudo ou même de changer les appartenances de groupe de leur utilisateur, surtout si leur disque commence à agir et qu'ils paniquent. C'est pourquoi je cherche une solution qui évite les détails techniques comme celui-ci.

+0

Il est certainement possible de configurer les choses comme ça - par exemple, le gestionnaire de paquets Synaptic est généralement configuré de cette façon. – caf

+0

Je ne suis pas sûr que vous devriez vraiment courir en tant que root. Si vous avez seulement besoin d'accéder au disque, il est préférable d'ajouter l'utilisateur au groupe "disque". –

+0

Milan - Mon application agit comme un outil de réparation de disque unique. Je ne pense pas que quiconque veut l'utiliser est prêt à changer ses paramètres à l'échelle du système pour cela, de façon quasi permanente. –

Répondre

3

L'ancienne méthode, simple mais en cours de suppression progressive, est GKSu. Here est la discussion sur l'avenir de GKSu. La nouvelle méthode consiste à utiliser PolicyKit. Je ne sais pas très bien comment cela fonctionne, mais je pense que vous devez lancer votre application en utilisant la commande pkexec.

MISE À JOUR:

En regardant l'exemple de code sur http://hal.freedesktop.org/docs/polkit/polkit-apps.html, il semble que vous pouvez utiliser PolicyKit pour obtenir l'autorisation pour certaines actions qui sont décrites par .policy fichiers dans /usr/share/polkit-1/actions. L'action pour exécuter un programme en tant qu'un autre utilisateur est org.freedesktop.policykit.exec. Je n'arrive pas à trouver une action pour accéder directement aux périphériques de bloc, mais je dois admettre que la documentation de PolicyKit me brise aussi la tête. Par conséquent, la solution la plus simple consiste peut-être à séparer votre code de gestion de disque nécessitant des privilèges dans un utilitaire de ligne de commande et à l'exécuter à partir de votre application GUI en utilisant g_spawn_[a]sync() avec pkexec. De cette façon, vous n'auriez pas à vous soucier de demander des actions et ce genre de chose. C'est probablement une mauvaise pratique de toute façon d'exécuter votre application GUI entière en tant que root.

Une autre suggestion est de demander directement à l'auteur de PolicyKit (David Zeuthen).Ou essayez de publier votre question dans la liste gtk-app-devel.

+0

J'ai essayé pkexec - malheureusement, cela ne fonctionne pas dans mon cas car je reçois le message d'erreur suivant: "Gtk-WARNING **: impossible d'ouvrir l'affichage:" - "man pkexec" explique pourquoi: "L'environnement que le programme l'exécutera, sera réglé à un environnement connu et sûr afin d'éviter d'injecter du code via LD_LIBRARY_PATH ou des mécanismes similaires. En outre, la variable d'environnement PKEXEC_UID est définie sur l'ID utilisateur du processus appelant pkexec. Par conséquent, pkexec ne vous permettra pas d'exécuter, par exemple, X11 en tant qu'utilisateur différent étant donné que la variable d'environnement $ DISPLAY est non définie. " Darn. –

+1

Hmm, je pense que l'API PolicyKit vous permet de réaliser la même chose, mais à partir de votre programme. Je ne suis pas sûr cependant. – ptomato

+0

SO ne m'a pas envoyé de mail à propos de votre mise à jour, donc je le vois seulement maintenant. Merci de faire l'effort supplémentaire, je pense qu'avec cette information, je peux aller de l'avant. –