如何使用 pkexec 执行 Python 脚本

Posted

技术标签:

【中文标题】如何使用 pkexec 执行 Python 脚本【英文标题】:How to Execute Python Script Using pkexec 【发布时间】:2021-01-30 22:50:25 【问题描述】:

对于一个项目,我正在 Linux 上为 ifconfig 编写 PyQt5 小部件。 我的代码的某些部分需要管理员权限。例如,关闭一个接口。

这是一个 GUI 应用程序,用户必须使用 GUI 输入他们的 sudo 密码。我在网上搜索,发现pkexec允许授权用户以其他用户身份执行程序。因此,我编写了所需的.policy 操作文件。我以前从未使用过 polkit,我可能错过了一些东西。

我可以使用没有错误地执行我的程序 python3 ifconfig_Logic.py

但是如果我尝试使用执行我的程序 pkexec python3 ~/Desktop/GUI/ifconfig_Logic.py 身份验证窗口上的消息是

消息不应该是 运行 ifconfigLogic 需要身份验证,而不是 安装此项目需要身份验证

另外,我收到以下错误

Traceback (most recent call last):
  File "/home/grandino/Desktop/GUI/ifconfig_Logic.py", line 9, in <module>
    baseUIClass, baseUIWidget = uic.loadUiType("ifconfig.ui")
  File "/usr/lib/python3/dist-packages/PyQt5/uic/__init__.py", line 199, in loadUiType
    winfo = compiler.UICompiler().compileUi(uifile, code_string, from_imports,
  File "/usr/lib/python3/dist-packages/PyQt5/uic/Compiler/compiler.py", line 111, in compileUi
    w = self.parse(input_stream, resource_suffix)
  File "/usr/lib/python3/dist-packages/PyQt5/uic/uiparser.py", line 1020, in parse
    document = parse(filename)
  File "/usr/lib/python3.8/xml/etree/ElementTree.py", line 1202, in parse
    tree.parse(source, parser)
  File "/usr/lib/python3.8/xml/etree/ElementTree.py", line 584, in parse
    source = open(source, "rb")
FileNotFoundError: [Errno 2] No such file or directory: 'ifconfig.ui'

ifconfig.uiifconfig_Logic.py用来导入界面的ui文件。我认为这个问题是因为 ifconfig.ui 没有添加到策略中,所以我添加了它。

这里是ifconfig_Logic.py

from PyQt5 import QtCore, QtGui, QtWidgets, QtWidgets
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QObject, QProcess, Qt
from PyQt5 import uic
from PyQt5 import QtGui


import sys

baseUIClass, baseUIWidget = uic.loadUiType("ifconfig.ui")

class ifconfig_Logic(baseUIWidget,baseUIClass):
    process = QProcess()
    send_output = pyqtSignal(str)


    def __init__(self, parent = None):
        super(ifconfig_Logic,self).__init__(parent)
        self.setupUi(self)
        self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint | QtCore.Qt.WindowMinimizeButtonHint)






if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ui = ifconfig_Logic(None)

    ui.show()

    sys.exit(app.exec_())

政策文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
 "-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>



  <action id="com.ifconfigLogic">
    <description>Run ifconfigLogic</description>
   
    <message>Authentication is required to run the ifconfigLogic</message>
   
    <defaults>
      <allow_any>auth_admin_keep</allow_any>
      <allow_inactive>auth_admin_keep</allow_inactive>
      <allow_active>auth_admin_keep</allow_active>
    </defaults>
    
     <annotate key="org.freedesktop.policykit.exec.path">/home/grandino/Desktop/GUI/ifconfig</annotate>
    <annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
  </action>

</policyconfig>

我该如何解决这个问题?为什么我使用pkexec 时文件似乎丢失了?

【问题讨论】:

我认为只允许一个 exec.path 行,所以 polkit 只得到第二行。 @ctac_ 你好,我已经改了。问题仍然存在。 我帮不上忙,我不使用python。您可以查看其他操作并找到您收到的消息。这样你就知道调用了什么动作。 【参考方案1】:

建议您构建绝对路径而不是使用相对路径。

import os.path

CURRENT_DIR = os.path.dirname(os.path.realpath(__file__))
ui_filename = os.path.join(CURRENT_DIR, "ifconfig.ui")

baseUIClass, baseUIWidget = uic.loadUiType(ui_filename)

【讨论】:

以上是关于如何使用 pkexec 执行 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

CVE-2021-4034 pkexec存在本地权限提升漏洞

CVE-2021-4034 pkexec存在本地权限提升漏洞

python如何重新执行脚本?

如何让Python脚本在cmd下执行

Python 如何写脚本?

如何用Python交互执行shell脚本