有选择地为一块(打包的)python .app 申请 root 访问权限

Selectively request root access for a piece of a (packaged) python .app

这个问题涉及到几个问题的碰撞,所有这些问题我都略知一二,但我把它们放在一起,因为它们都可以作为解决问题的切入点。这是我能给出的最好的描述。

我有一个应用程序,在 python。 (我想我理论上可以通过学习 Cocoa 和 ObjectiveC 来解决所有这些问题,但是对于这个问题来说,这似乎是一个很大的进步——而且,如下所述,这个问题实际上可能与 python,真的,完全没有。我只是不知道。)这个应用程序的核心功能是使用热键触发迷你游戏——也就是说,热键本身是所需功能的基础。而且,我真的很想打包这个应用程序,让其他人使用它。 (在本地,效果很好!嘿嘿!)

问题始于添加热键这一事实——我正在使用

import keyboard
keyboard.add_hotkey('windows+shift+y', trigger_minigame)

-- 需要 root 权限。由于另一个 SO post Forcing a GUI application to run as root 中的严重警告(老实说,我只是模糊地理解),我只想授予该程序的这一部分的访问权限。我想象,这样的方法看起来像这样:

# needs_root.py
import keyboard
from shouldnt_have_root import trigger_minigame
keyboard.add_hotkey('windows+shift+y', trigger_minigame)

# shouldnt_have_root.py
def minigame():
    buncha pygame, GUI stuff (which is dangerous???)
def trigger_minigame():
    adds event to minigame's event queue

# bash script
sudo python needs_root.py

然而 -- 有几个主要的挑战! 最大的问题是我什至不知道这是否安全,因为我根本不知道安全和权限(尤其是导入)是如何工作的!更一般地说,进口产品有多危险?看来我实际上可能必须导入更多内容,以明确触发器将事件添加到哪个事件队列——而且我不知道如何进行这种通信,同时仍然隔离 GUI 部分(或通常是危险的)从不必要和危险的访问。

虽然还有另一层;通过 pyinstaller 打包它意味着我不能直接以脚本为目标,因为它们会变成二进制文件,但根据这个答案 Packaging multiple scripts in PyInstaller 看来我可以只以二进制文件为目标,即拥有第一个二进制文件打电话

osascript -e 'do shell script "python needs_root_binary" with admin.'

让用户只祝福必要的部分,但我不知道这是否会造成其他障碍或漏洞(或文件间通信困难)。

最后,我可以尝试以 root 用户身份启动,然后在设置热键后(在发生任何其他事情之前)立即切换为 root 用户——但这样安全吗?我仍然担心它涉及整个应用程序的 运行 sudo。

无论如何——

这是否像它感觉的那样一团糟?

如何只授予 root 访问我在 python 中编写的打包 .app 的一部分?

我建议您:

  1. 启用root权限,
  2. 编写脚本,
  3. 禁用根访问权限

因为它在 here.

中有更详细的描述

Pyinstaller 是另一章。当我制作需要使用热键的软件时,我不得不使用 keyboard 以外的其他软件,因为没有 Python 它在 PC 上无法正常工作,因此我制作了一个热键使用 tkinter 内置函数 canvas.bind()(更多信息 here)。

希望我有所帮助。

您不能 运行 一个特定的 Python 函数作为 root,只有执行脚本的 Python 进程可以 运行 具有提升的权限。

所以我的回答是:你描述的问题是无法解决的。