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

2024-04-25 08:48:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 文件用户程序密码进程方式平台办法
3条回答

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

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

我会把程序一分为二。

  1. 处理打开文件和访问内容的操作。它可以假设它是以所需的权限启动的。
  2. 其他不需要特殊特权的东西。

放置一个配置项,描述如何execsubprocess需要额外权限的命令。即

access_special_file: sudo access_special_file

或者

access_special_file: runas /user:AccountWithPrivs access_special_file

这会将权限提升的一些系统细节卸载到系统外壳程序中,在那里可能有更方便的方法来获得所需的权限。

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

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

  1. 假设您以根用户身份运行并打开文件进行读取。既然你提到这个文件很大,你实际上并没有把整个文件都读入,你只需要保持一个打开的文件描述符。如果打开失败,则打印错误消息并退出。
  2. 使用^{}^{}将您的用户ID和组ID设置回非特权用户。
  3. 使用^{}函数之一执行未授权的可执行文件。
  4. 如果您想使其不使用sudo即可运行此程序,则将其归root所有,并使用chown root the-program; chmod +s the-program将其设置为可执行的用户ID。

未授权的程序现在将以正常权限运行,但当它启动时,它将有一个打开的文件描述符(文件描述符3),可用于从特殊文件中读取。

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

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

然后,子进程通过解析命令行来获取继承的句柄,然后它可以随心所欲地读入数据。

这种方法的一个问题是,当继承句柄时,必须使用低级系统调用(在{Unix上的CD13>},^ {CD14>}在Windows上)从中读取——不能使用诸如C ^ ^ {CD15>}或C++ ^ {CD16>}s的高级函数(OK,UNIX具有^ {CD17>},但在我所知的Windows上没有等价物)。

我相信您现在已经注意到了,上面的所有内容都是用C语言编写的。在Unix中,这相当直接地转化为Python,因为^{} module有很多优点,比如setreuidexec*fdopen。在Windows上,您可以使用ctypes模块和/或Pywin32来完成这些工作,但是使用C可能更容易

相关问题 更多 >