Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将根权限传递给;os";Python中的命令_Python_Qt_File Permissions_Privilege Elevation - Fatal编程技术网

将根权限传递给;os";Python中的命令

将根权限传递给;os";Python中的命令,python,qt,file-permissions,privilege-elevation,Python,Qt,File Permissions,Privilege Elevation,我正在向PyQt5应用程序添加功能。这项新功能涉及复制、链接和删除可能位于受保护目录中的文件(和链接),因此像os.symlink或shutil.copyfile这样的命令将失败 当然,主应用程序不是以root权限运行的(要求用户这样做是不可能的),所以我需要一个解决方法 第一件事当然是将关键代码包装在try/except块中,并调查任何异常。如果发现缺少根权限是一个问题,我会在一个对话框中要求输入密码(假设只要当前对话框还活着,就存储密码) 但我不确定如何使用root密码重复该步骤。我强烈希望

我正在向PyQt5应用程序添加功能。这项新功能涉及复制、链接和删除可能位于受保护目录中的文件(和链接),因此像
os.symlink
shutil.copyfile
这样的命令将失败

当然,主应用程序不是以root权限运行的(要求用户这样做是不可能的),所以我需要一个解决方法

第一件事当然是将关键代码包装在try/except块中,并调查任何异常。如果发现缺少根权限是一个问题,我会在一个对话框中要求输入密码(假设只要当前对话框还活着,就存储密码)

但我不确定如何使用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

使用计数器将try/except代码包装在循环中:

def my_copy(source, dest):
    for attempts in [1, 2]:
        try:
            os.path.symlink(source, dest)
            # we succeeded, so don't try any more
            break
        except: # check for permission problem:
            if attempts == 1:
                # use dialog to ask for password
                # repeat the symlink procedure with password
            else:
                 # we already tried as root, and failed again
                 break

在大多数现代操作系统上,您试图在这里做的基本上是不可能的,这是有充分理由的

想象一下,一个典型的macOS或Windows用户希望能够通过使用指纹读取器而不是键入密码进行身份验证。或者一个盲人用户。或者是有理由怀疑你的应用程序在非内核内存中以Python字符串的形式以明文存储密码的人(更不用说在Windows对话框中,它的事件可以被任何进程钩住)。这就是为什么现代平台会有一个类似的框架。等等

特权升级的工作方式在Windows和POSIX之间,甚至在macOS和Linux之间都是如此不同,更不用说发展如此迅速,据我所知,没有跨平台的框架来实现这一点

事实上,大多数系统首先不鼓励应用程序驱动的权限提升。在Windows上,您经常要求操作系统以提升的权限运行助手应用程序(然后操作系统将应用适当的策略并决定请求什么)。在macOS上,您通常编写一个LaunchServices守护程序,该守护程序在安装时(使用特殊的安装程序API)而不是运行时获得权限。对于传统的非服务器POSIX应用程序,您通常会执行类似的操作,但是使用
setuid
帮助程序,您可以在安装时创建它,因为安装是以root用户身份运行的。对于传统的POSIX服务器,您通常以root用户身份启动,然后在分叉并执行类似的helper守护程序后删除priv


如果这一切看起来比你想处理的工作多得多……那么,老实说,这可能就是你的意图。操作系统设计人员不希望应用程序设计人员引入安全漏洞,因此他们确保您必须了解平台需要什么以及如何使用它,而不是在您尝试移动您没有权限访问的文件之前使用它。

在对话框中询问密码没有帮助,因为大多数操作系统都不允许你使用它做任何有用的事情,而聪明的用户也不想让你把它存储在不受保护的内存中。您需要使用libpam、授权服务或我忘记名称的Windows API来请求用户进行身份验证,或者您需要创建一个
suid
帮助程序或一个通过某些IPC进行通信的守护程序或Windows服务,以便用户可以在安装时授予权限。或者,你可以让你的应用程序以root用户身份启动,然后用一个非root进程来运行GUI,而用root进程来做root工作。我认为让用户以root用户身份启动整个程序是不可接受的想法。也许我不得不简单地告诉用户权限问题,并告诉他们如何在应用程序之外手动解决任务。对不起,虽然这是一个很好的例子,但部分问题并不是我真正想问的(可能问题不够清楚)。我的问题不是控制结构,而是如何向文件操作传递密码。尽管如此,我还是要投票,因为这将有助于人们找到这一页。谢谢,这是一个很好的解释,没有给我实现我所要求的步骤。我模模糊糊地意识到了这一点(至少在没有为Python和Qt找到合适的本机工具之后),但这让我更愿意只向用户提供反馈,让他们在外部完成这项工作。