【发布时间】:2019-01-07 00:33:35
【问题描述】:
我正在向 PyQt5 应用程序添加功能。这项新功能涉及复制、链接和删除可能在受保护目录中的文件(和链接),因此os.symlink 或shutil.copyfile 等命令将失败。
当然,主应用程序不是以 root 权限运行的(要求用户这样做是不可能的),所以我需要一个解决方法。
首先当然是将关键代码包装在 try/except 块中并调查任何异常。如果事实证明缺少 root 权限是我会在对话框中询问密码的问题(大概只要当前对话框处于活动状态就存储密码)。
但我不确定如何使用 root 密码重复步骤 。我强烈希望在 Python 域中执行此操作(或者 Qt 是否为文件操作提供了一些支持?我敢打赌它确实提供了,但我找不到它)。我认为应该可以通过在 shell 命令中执行文件操作并以某种方式将密码传递给该命令,但由于 Python 和 PyQt 旨在保护程序员免受操作系统差异的复杂性影响,我宁愿避免使用这种方法。
一些伪代码应该可以清楚地说明问题:
def my_copy(source, dest):
try:
os.path.symlink(source, dest)
except: # check for permission problem:
# use dialog to ask for password
# repeat the symlink procedure with password
【问题讨论】:
-
在对话框中询问密码不会有帮助,因为大多数操作系统不会让你用它做任何有用的事情,聪明的用户不会想把它交给你以不受保护地存储记忆。您需要使用 libpam、授权服务或我忘记名称的 Windows API 来要求用户进行身份验证——或者您需要创建一个
suid帮助程序或一个守护程序或 Windows 服务,您可以通过某些 IPC 与之通信,因此用户可以在安装时授予权限。 -
或者,您也可以让您的应用以 root 身份启动,然后派生一个非 root 进程来运行 GUI,同时使用 root 进程执行 root 工作。
-
我不认为要求用户以 root 身份启动整个程序是一个可以接受的想法。也许我不得不诉诸于简单地通知用户权限问题,并告诉他们如何在应用程序之外手动解决任务。
标签: python qt file-permissions privilege-elevation