我正在向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
答案 0 :(得分:1)
在大多数现代操作系统上,您要做的基本上都是不可能的,这是有充分理由的。
想象一个典型的macOS或Windows用户,他们希望能够使用指纹读取器而不是输入密码来进行身份验证。还是盲目的用户。或是对您的应用有偏执的人,他们的应用将密码以明文形式存储在非内核内存中的Python字符串中(更不用说在Windows对话框中了,它的事件可以由任何进程挂起)。这就是为什么现代平台附带libPAM
/XSSO
,Authorization 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)