将root权限传递给Python中的“ os”命令

时间:2018-07-30 17:30:00

标签: python qt file-permissions privilege-elevation

我正在向PyQt5应用程序添加功能。这项新功能涉及复制,链接和删除可能位于受保护目录中的文件(和链接),因此os.symlinkshutil.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

2 个答案:

答案 0 :(得分:1)

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

想象一个典型的macOS或Windows用户,他们希望能够使用指纹读取器而不是输入密码来进行身份验证。还是盲目的用户。或是对您的应用有偏执的人,他们的应用将密码以明文形式存储在非内核内存中的Python字符串中(更不用说在Windows对话框中了,它的事件可以由任何进程挂起)。这就是为什么现代平台附带libPAM/XSSOAuthorization Services之类的框架的原因。等

在Windows和POSIX之间,甚至在macOS和Linux之间,特权升级的工作方式是如此不同,更不用说发展如此迅速了,据我所知,没有跨平台的框架可以做到这一点。 / p>

实际上,大多数系统首先都不鼓励应用程序驱动的特权升级。在Windows上,您经常要求操作系统以提升的特权运行助手应用程序(然后操作系统将应用适当的策略并决定要提出的要求)。在macOS上,通常会编写一个LaunchServices守护程序,该守护程序在安装时(使用特殊的安装程序API)而非运行时获得许可。对于传统的非服务器POSIX应用程序,您通常会执行类似的操作,但是使用<div class="row"> <a href="#"> <div class="col-sm-12 small-padding top bottom"> <div class="index-content"> <div class="card"> <img src="https://www.sardiustours.com/wp-content/uploads/2016/09/lion-1118467_1920-Copy.jpg"></img> <div class="card-content-textbox flexbox-column"> <h4>BMW & HEADLINE 2018</h4> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p> <div class="inner-wrapper header-textbox-bottom-left"> <button class="btn btn-success">Read More</button> </div> </div> </div> </div> </div> </a> </div> <div class="row"> <div class="col-sm-12 small-padding right bottom"> <div class="index-content"> <div class="card"> <img src="https://s-media-cache-ak0.pinimg.com/originals/87/bf/cf/87bfcfb36780c0fec472d8d301be7a1c.jpg"></img> <div class="card-content"> <div class="card-content__info"> <h4>HIGH SERVICELEVEL AND QUALITY</h4> <span>Book a meeting and let's find a solution</span> </div> <button type="button" class="btn btn-success bottom-right">Read more</button> </div> </div> </div> </div> </div>帮助程序可以在安装时创建,只是因为安装是作为root运行的。对于传统的POSIX服务器,您通常以root身份启动,然后在分叉并执行类似的帮助程序守护程序后放弃privs。

如果所有这些似乎都比您想处理的工作更多……坦白地说,这可能就是我们的意图。操作系统设计人员不想让应用程序设计人员引入安全漏洞,因此他们确保您必须了解平台所需的内容以及如何使用该平台,而不是针对平台,甚至在您尝试进行类似操作之前移动您没有权限的文件。

答案 1 :(得分:0)

将try / except代码包装在带有计数器的循环中:

sapply(x$number, clsfy)