【发布时间】:2019-02-25 10:55:35
【问题描述】:
我编写了一个 python 脚本,它从启动板下载 deb 文件,然后调用一个 shell 脚本来使用外星人将 debs 转换为 rpms。
shell脚本使用了外星人,所以需要以root身份运行。
程序使用线程池异步下载deb文件,使用threadpool.apply_async,然后使用处理池异步调用shell脚本,所以整个事情发生的相当快。
一切正常,但调用外星人的 shell 脚本需要是 root 否则无法正确构建包。当我第一次完成脚本时,我会在使用 sudo 之后使用 pkexec 调用外星人。在这两种情况下,我都遇到了一些问题。
第一个是在root启动时,我失去了用户的环境,因此失去了pip安装的python库。也许我可以使用 sudo -s 或类似的,但第二个问题是我必须为构建的每个包输入我的 root 密码。
我想要做的是,以普通用户的身份运行python脚本,qt gui等,选择要转换的文件,然后点击安装按钮,只输入我的超级用户密码一次。
我决定过滤掉python的安装部分,包括线程下载和对shell脚本的线程调用,然后尝试以root/超级用户身份运行这些部分。
我为此安装部分创建了一个 dbus 服务,并且在经历了一段陡峭的 dbus 学习曲线之后,我设法让该服务正常工作。但是,让脚本通过身份验证并提高其权限,我并不高兴。
我已经能够使用polkit显示密码对话框并授权超级用户,但是我不知道如何使用polkit的返回值
`authority.CheckAuthorization(subject, action_id, details, flags, cancellation_id)`
显示密码对话框,用于授权,但不处理提升脚本权限。
我已将 python 安装服务设置为 0500 权限,因此希望一旦我弄清楚如何提升权限,root 用户就能够读取和执行当前在会话总线上创建的服务。
如何提升权限,同时保留用户的环境变量,这样我就不用在root账户下安装python模块了?
非常感谢您提前提供的帮助...
ps。我编写了一个 polkit 操作文件和一个 polkit 规则,但在每种情况下,我都不确定操作 id 与特权提升有何关系。 pps。我可以/应该使用 pam 吗?
【问题讨论】:
-
你确定外星人不能使用 fakeroot 吗?
-
polkit 不会提升进程的权限;这只是一个已经拥有特权的进程在非特权进程请求它时检查它是否应该执行特定操作的一种方式。您需要以 root 身份运行您的服务。
-
谢谢,我会调查 fakeroot。 polkit checkauthorization 命令的意义何在?它会产生一个密码提示,但仅此而已吗?而且如果需要服务的脚本不是root,会不会自动有密码提示来运行呢?我将不得不做一些阅读/黑客攻击。还是谢谢
标签: python dbus pam polkit dbus-python