使用 dbus 和 polkit 运行 root 权限 python 调用根脚本的服务

using dbus and polkit to run a root privilege python service that calls a root script

我写了一个 python 脚本,它从启动板下载 deb 文件,然后调用 shell 脚本使用 alien 将 deb 转换为 rpms。

shell脚本使用外星人,因此需要运行作为root。

该程序使用线程池异步下载 deb 文件,使用 threadpool.apply_async,然后使用处理池异步调用 shell 脚本,因此整个过程发生得相当快。

一切正常,但是调用 alien 的 shell 脚本需要是 root,否则无法正确构建包。当我第一次完成脚本时,我会在使用 sudo 之后使用 pkexec 调用 alien。在这两种情况下,我都遇到了一些问题。

首先是在以 root 启动时,我丢失了用户环境,因此丢失了 pip 安装的 python 库。我可以,也许 ps,已经使用 sudo -s 或类似的,但第二个问题是我必须为每个构建的包输入我的 root 密码。

我想做的是 运行 python 脚本,qt gui 和所有,作为普通用户 select 要转换的文件,然后点击安装按钮,只输入一次我的超级用户密码。

我决定过滤掉 python 的安装部分,其中包括线程下载和对 shell 脚本的线程调用,然后尝试 运行 这些部分作为 root/superuser.

我为此安装部分创建了一个 dbus 服务,并且在经历了陡峭的 dbus 学习曲线之后,设法让该服务正常工作。但是,我对脚本进行身份验证并提升其权限并不感到高兴。

我已经能够使用 polkit 来显示密码对话框并授权超级用户,但我不知道如何使用 polkit

中的 return 值
`authority.CheckAuthorization(subject, action_id, details, flags, cancellation_id)`

显示用于授权的密码对话框,但不处理提升脚本权限。

我已将 python 安装服务设置为 0500 perms,因此希望一旦我弄清楚如何提升权限,root 用户就可以读取和执行该服务,目前是在会话总线上创建。

如何提升权限,同时保留用户的环境变量,这样我就不必在root帐户中安装python个模块?

非常感谢您的提前帮助...

ps。我已经编写了一个 polkit 操作文件和一个 polkit 规则,但在每种情况下我都不确定操作 ID 如何与特权提升相关。 pps。 I/should 我可以使用 pam 吗?

我最终运行进程以root身份,使用pkexec获取密码对话框。