В какой-то момент моему приложению необходимо выполнить административные задачи, такие как создание файла в / 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 . ;-(
Ответы:
Есть фундаментальная концепция, которую нужно понять в первую очередь: PolicyKit обрабатывает только авторизацию, а не повышение привилегий. PolicyKit ответит на вопрос: «авторизован ли пользователь для выполнения этой задачи?», Но он не даст вам привилегий root.
Обычно используемая модель заключается в создании системной службы DBus, которая работает с привилегиями root. Он будет принимать запросы от некорневых процессов, использовать PolicyKit, чтобы определить, авторизован ли этот процесс для выполнения этого запроса, а затем выполнить запрошенную задачу.
Несколько лет назад я написал учебник по PolicyKit и DBus с Python на ubuntuforums.org . Принципы одинаковы, хотя может потребоваться обновление. Мне нужно сейчас лечь спать, так что посмотри и дай мне знать, если это нужно обновить.
источник