有时我的应用程序需要执行管理任务,例如在 /etc 中创建文件或以 root 权限运行命令。
我知道可以进行问答:
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() 命令。现在我知道得更多了 :(
我可以在上面的例子中看到元组结果,但是在进一步的文档中我找不到可以继续的工作代码。
我对这个结果有什么看法?我该如何继续执行我需要的任务?是否有提供可用方法的 Python 参考资料和示例?
我尝试使用 dir() 列出授权方法,但找不到任何线索来继续。
我真的不想使用我的后备方案,但这是我的最后手段。请帮助我以正确的方式做到这一点 :)
感谢致敬
安德烈
编辑:
由于我没有让它工作,并且我以前使用 gksu 启动程序的解决方案在 /opt/ 之外不起作用,我最终不得不放弃并执行一千次密码请求,以使程序基本工作,以便在应用程序对决中获得至少一件 T 恤。
我没有注意到这个问题,因为我首先进行了快速共享。一切都正常。一开始要求输入一次密码。我现在完全失望了。我对 AppShowdown 的贡献是https://launchpad.net/armorforge。 ;-(
答案1
首先,您需要掌握一个基本概念:PolicyKit 仅处理授权,而不处理权限提升。PolicyKit 将回答以下问题:“用户是否有权执行此任务?”,但不会授予您 root 权限。
常用的模型是创建一个 DBus 系统服务,以 root 权限运行。它将接收来自非 root 进程的请求,使用 PolicyKit 确定该进程是否有权发出该请求,然后执行请求的任务。
我写了一个ubuntuforums.org 上有关使用 Python 的 PolicyKit 和 DBus 的教程几年前。原理是一样的,尽管可能需要一些更新。我现在要睡觉了,所以看看它是否需要更新,告诉我。