Корневые задачи с использованием dbus и policykit

10

В какой-то момент моему приложению необходимо выполнить административные задачи, такие как создание файла в / etc или выполнение команд с правами суперпользователя.

Я знаю, что только мог сделать Q & D:

os.popen("pkexec foo bar")

Но я также знаю, что это не предвиденный чистый способ сделать это. Что-то раздражает пользователя, потому что ему всегда нужно вводить свой пароль вместо того, чтобы выполнять сессионную обработку.

Я был очень оптимистичен, так как нашел пример Python для аутентификации .

Это простой пример, который работает сразу:

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 () -. Теперь я знаю лучше :(

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

Что мне делать с этим результатом? Как я могу продолжать выполнять задачи, которые мне нужны? Есть ли ссылка на Python с примерами, которые предлагают доступные методы?

Я попытался перечислить методы авторизации с помощью dir (), но не смог найти подсказки, как это сделать.

Я действительно хочу избежать использования моего запасного варианта, но это будет моим последним средством. Пожалуйста, помогите мне сделать это правильно :)

Спасибо и всего наилучшего

Андре

Редактировать:

Из-за того, что я не использовал это, и мое прежнее решение, запустив мою программу с gksu, не работает из / opt /, мне, наконец, пришлось отказаться и реализовать тысячу запросов на пароль, чтобы заставить программу работать, чтобы получить хотя бы футболка в вскрытии приложения.

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

liberavia
источник
Я думаю, что вы могли бы найти лучшие ответы в StakOverflow. Вы должны задать этот вопрос для переноса туда.
jgomo3

Ответы:

7

Есть фундаментальная концепция, которую нужно понять в первую очередь: PolicyKit обрабатывает только авторизацию, а не повышение привилегий. PolicyKit ответит на вопрос: «авторизован ли пользователь для выполнения этой задачи?», Но он не даст вам привилегий root.

Обычно используемая модель заключается в создании системной службы DBus, которая работает с привилегиями root. Он будет принимать запросы от некорневых процессов, использовать PolicyKit, чтобы определить, авторизован ли этот процесс для выполнения этого запроса, а затем выполнить запрошенную задачу.

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

Флимм
источник
Может ли он использоваться для того, чтобы Virtualbox мог устанавливать пакеты расширений под обычным пользователем?
Грю