Кореневі завдання за допомогою dbus та policykit


10

У якийсь момент моїй програмі потрібно виконати адміністративні завдання, такі як створення файлу в / etc або виконання команд з кореневими привілеями.

Я знаю, що просто міг би зробити питання:

os.popen("pkexec foo bar")

Але я також знаю, що це не передбачений чистий спосіб зробити це. Якийсь прикрість для користувача, тому що йому завжди потрібно повторно ввести свій пароль, а не працювати з сеансом.

Я був дуже оптимістичним, коли знайшов приклад пітона для автентичності .

Це простий приклад, який працює негайно:

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

Я досить наївно думав, що після авторизації я можу просто продовжувати роботу в сценарії з деякими командами os.popen () -. Тепер я знаю краще :(

Я можу побачити результат кортежу на прикладі вище, але в подальшій документації я не зміг знайти робочий код, який слід продовжувати в цей момент.

Що я маю робити з цим результатом? Як я можу продовжувати виконувати потрібні завдання? Чи є посилання python із прикладами, які пропонують доступні методи?

Я спробував перерахувати методи авторизації за допомогою dir (), але не міг знайти підказки, як далі.

Я дуже хочу уникати використання резервного моменту, але це було б моїм останнім заходом. Будь ласка, допоможіть мені зробити це правильно :)

Дякую та з повагою

Андре

Редагувати:

Через те, що я не привів це до роботи, і колишнє рішення, починаючи програму з gksu, не виходить / opt /, я нарешті повинен був відмовитись та реалізувати тисячу запитів пароля, щоб зробити програму рудиментарною роботою, щоб отримати хоча б футболку в розборі додатків.

Я не помітив проблеми, тому що спершу швидко поділився. Там все працювало правильно. Попросити один раз пароль на початку. Я зараз повністю знижений. Мій внесок у програму AppShowdown став https://launchpad.net/armorforge . ;-(


Я думаю, ви могли б знайти кращі відповіді на StakOverflow. Вам слід попросити перенести це питання туди.
jgomo3

Відповіді:


7

Існує фундаментальна концепція, яку потрібно зрозуміти спочатку: PolicyKit обробляє лише авторизацію, а не ескалацію привілеїв. PolicyKit відповість на запитання: "чи користувач уповноважений виконувати це завдання?", Але він не надасть вам привілеїв root.

Загальновживана модель полягає у створенні системної служби DBus, яка працює з правами root. Він буде приймати запити від некореневих процесів, використовуйте PolicyKit, щоб визначити, чи уповноважений цей процес робити цей запит, а потім виконайте запитуване завдання.

Кілька років тому я написав підручник щодо PolicyKit та DBus з Python на ubuntuforums.org . Принципи однакові, хоча може знадобитися певне оновлення. Мені потрібно лягати спати зараз, тому подивіться і повідомте мені, чи потрібно оновлення.


Чи можна його використовувати, щоб дозволити віртуальну скриньку встановлювати розширення пакунків під звичайним користувачем?
Грю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.