В какой-то момент мое приложение должно сделать задачи администрирования как создание файла в / и т.д. или выполнении команд с корневыми полномочиями.
Я знаю, просто мог сделать Q&D:
os.popen("pkexec foo bar")
Но я также знаю, что это не предсказанный очевидный способ, чтобы сделать это. Некоторое раздражение для пользователя, потому что он всегда должен повторно входить в свой пароль вместо того, чтобы иметь подобную сессии обработку.
Я был очень оптимистичен, когда я нашел пример Python для аутентификации.
Это - простой пример, который работает immediatly:
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 (), но не мог найти подсказку, как продолжить.
Я действительно хочу избегать использования своей нейтрализации, но это было бы мое последнее средство. Помогите мне делающий его правильный путь :)
Спасибо и всего наилучшего
André
Править:
Должный я не принес это для работы, и мое прежнее решение путем запуска моей программы с gksu не работает из/, выбирают/, я наконец должен был сдаться и реализовать тысячу, просит пароль делать программу элементарной работой для получения, по крайней мере, Футболки в откровенном обмене мнениями приложения.
Я не заметил проблемы, потому что я сначала сделал быстро доля. Там все работало правильно. Просьба однажды о пароле вначале. Я полностью снижаюсь теперь. Мой вклад для AppShowdown был https://launchpad.net/armorforge.; - (
Существует фундаментальная концепция, которую нужно понять в первую очередь: PolicyKit обрабатывает только авторизацию, а не повышение привилегий. PolicyKit ответит на вопрос: «авторизован ли пользователь для выполнения этой задачи?», Но он не даст вам привилегий root.
Обычно используемая модель заключается в создании системной службы DBus, которая работает с привилегиями root. Он будет принимать запросы от некорневых процессов, использовать PolicyKit, чтобы определить, авторизован ли этот процесс для выполнения этого запроса, а затем выполнить запрошенную задачу.
Я написал учебник по PolicyKit и DBus с Python на ubuntuforums.org несколько лет назад. Принципы одинаковы, хотя может потребоваться обновление. Мне нужно сейчас лечь спать, так что взгляните и дайте мне знать, если это нужно обновить.