À un moment donné, mon application doit effectuer des tâches administratives telles que créer un fichier dans/etc ou exécuter des commandes avec des privilèges root.
Je sais que je pourrais faire un Q & D:
os.popen("pkexec foo bar")
Mais je sais aussi que ce n’est pas la manière propre prévue de le faire. Une sorte d'ennui pour l'utilisateur car il doit toujours ressaisir son mot de passe au lieu d'une gestion de session.
J'étais très optimiste car j'ai trouvé l'exemple python pour l'authentification .
C'est un exemple simple qui fonctionne immédiatement:
import dbus
bus = dbus.SystemBus()
proxy = bus.get_object('org.freedesktop.PolicyKit1', '/org/freedesktop/PolicyKit1/Authority')
authority = dbus.Interface(proxy, dbus_interface='org.freedesktop.PolicyKit1.Authority')
system_bus_name = bus.get_unique_name()
subject = ('system-bus-name', {'name' : system_bus_name})
action_id = 'org.freedesktop.policykit.exec'
details = {}
flags = 1 # AllowUserInteraction flag
cancellation_id = '' # No cancellation id
result = authority.CheckAuthorization(subject, action_id, details, flags, cancellation_id)
print result
J'ai été assez naïf en pensant qu'après autorisation, je pouvais continuer dans le script avec quelques commandes os.popen (). Maintenant je sais mieux :(
Je peux voir le résultat du tuple dans l'exemple ci-dessus, mais dans la documentation suivante, je n'ai pas trouvé de code fonctionnel pour continuer à ce stade.
Qu'est-ce que je dois faire avec ce résultat? Comment puis-je continuer à exécuter les tâches dont j'ai besoin? Existe-t-il une référence python avec des exemples proposant les méthodes disponibles?
J'ai essayé de lister les méthodes d'autorisation en utilisant dir () mais je ne trouvais aucune idée de la marche à suivre.
Je veux vraiment éviter d'utiliser mon recours, mais ce serait mon dernier recours. S'il vous plaît aidez-moi à le faire de la bonne façon :)
Merci et salutations
André
Modifier:
Dû au fait que je n’ai pas mis cela au travail et que ma solution précédente en démarrant mon programme avec gksu ne fonctionne pas avec/opt /, j’ai finalement dû abandonner et mettre en œuvre un millier de demandes de mot de passe pour que le programme soit un travail rudimentaire pour obtenir au moins un t-shirt dans l'abattage des applications.
Je n'ai pas remarqué le problème car j'ai d'abord fait une part rapide. Là tout a fonctionné correctement. Demander une fois le mot de passe au début. Je suis totalement en panne maintenant. Ma contribution pour AppShowdown était https://launchpad.net/armorforge . ;-(
Vous devez d'abord comprendre un concept fondamental: PolicyKit ne gère que les autorisations, pas les droits d'accès. PolicyKit répondra à la question: "l'utilisateur est-il autorisé à effectuer cette tâche?", Mais ne vous donnera pas les privilèges root.
Le modèle couramment utilisé consiste à créer un service système DBus, qui s'exécute avec les privilèges root. Il prendra les demandes des processus non root, utilisera PolicyKit pour déterminer si ce processus est autorisé à faire cette demande, puis effectuera la tâche demandée.
J'ai écrit un tutoriel sur PolicyKit et DBus avec Python sur ubuntuforums.org il y a quelques années. Les principes sont les mêmes, mais il faudra peut-être mettre à jour. Il faut que je me couche maintenant, alors jetez un coup d'œil et dites-moi s'il faut l'actualiser.