首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >以超级用户身份在python中打开文件

以超级用户身份在python中打开文件
EN

Stack Overflow用户
提问于 2011-09-09 05:37:43
回答 4查看 10.9K关注 0票数 5

我必须打开一个系统文件并从中读取。此文件通常只有root用户(超级用户)才能读取。我有一种方法可以向用户索要超级用户密码。我希望使用此凭据打开文件并从中读取,而无需将整个程序作为超级用户进程运行。有没有办法以一种多平台的方式实现这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-09-09 07:30:33

由于特权在类Unix系统和Windows上的工作方式完全不同,因此需要特定于平台的代码。在任何情况下,您都需要将程序拆分成两个独立的程序,其中一个程序以提升的权限运行,另一个程序以标准/降低的权限运行。

在类Unix系统(包括Linux和Mac OS X)中,以提升权限运行的可执行文件应执行以下操作:

  1. 假定您是以超级用户身份运行的,并打开文件进行读取。由于您提到该文件非常大,因此实际上并不读取整个文件,而只是保留一个打开的文件描述符。如果打开失败,则打印一条错误消息并退出。
  2. 使用setreuid(2)setregid(2)将您的用户ID和组ID重新设置为非特权用户。
  3. 使用exec(3)函数之一来执行您要创建的非特权用户,以便您可以在不使用sudo的情况下运行此程序,然后使其归超级用户所有并使用root使其成为set- user -ID可执行文件

非特权程序现在将以普通权限运行,但当它启动时,它将有一个打开的文件描述符(文件描述符#3),可用于读取您的特殊文件。

对于Windows,它类似,但略有不同:

  1. 假定您是以超级用户身份运行的,并使用CreateFile打开要读取的文件。不要使用默认的安全属性--创建一个bInheritHandle设置为TRUESECURITY_ATTRIBUTES结构,以便子进程可以继承该句柄。如果打开文件失败,则打印一条错误消息并退出。
  2. 使用CreateProcess启动子进程。在命令行中传入上面的句柄(例如,打印为数值);您也可以使用use a shared memory region,但这比在此可执行文件中将requireAdministrator设置为true时使用此problem.
  3. Embed a manifest更麻烦。执行此操作后,当您运行该程序时,会出现一个UAC提示,询问您是否允许该程序进行更改。

然后,子进程通过解析命令行来获取继承的句柄,然后可以根据需要读取数据。

这种方法的一个问题是,当您继承一个句柄时,您必须使用低级系统调用(在Unix上是read(2),在Windows上是ReadFile )来读取它--您不能使用像C的fread(3)或C++的iostream这样的高级函数(好的,Unix有fdopen(3),但据我所知,在Windows上没有对应的函数)。

我相信你现在已经注意到了,上面的一切都是用C编写的。在Unix中,这可以非常直接地转换成Python,因为os module有很多好东西,比如setreuidexec*fdopen。在Windows上,您也许可以使用ctypes模块和/或Pywin32来做一些这样的事情,但是坚持使用C可能更容易一些。

票数 4
EN

Stack Overflow用户

发布于 2011-09-09 05:45:00

您正在寻找的是所谓的权限提升,这在很大程度上取决于您运行的平台。一般来说,你的程序需要做的就是以超级用户的身份运行一部分。例如,在unix系统上,您可能能够使用sudo读取文件的内容。

但如前所述,这实际上取决于您运行的系统。

票数 4
EN

Stack Overflow用户

发布于 2011-09-09 06:47:40

我会把程序一分为二。

  1. 负责打开文件和访问内容。它可以假定它是用它needs.
  2. Everything的特权启动的,否则不需要特殊特权。

输入一个配置项,描述如何对需要额外权限的命令执行execsubprocess操作。即。

access_special_file: sudo access_special_file

access_special_file: runas /user:AccountWithPrivs access_special_file

这会将特权提升的一些系统细节转移到系统shell,在系统shell中可能有更方便的方法来获得所需的权限。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7354834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档