我必须打开一个系统文件并从中读取。此文件通常只有root用户(超级用户)才能读取。我有一种方法可以向用户索要超级用户密码。我希望使用此凭据打开文件并从中读取,而无需将整个程序作为超级用户进程运行。有没有办法以一种多平台的方式实现这一点?
发布于 2011-09-08 23:30:33
由于特权在类Unix系统和Windows上的工作方式完全不同,因此需要特定于平台的代码。在任何情况下,您都需要将程序拆分成两个独立的程序,其中一个程序以提升的权限运行,另一个程序以标准/降低的权限运行。
在类Unix系统(包括Linux和Mac OS X)中,以提升权限运行的可执行文件应执行以下操作:
setreuid(2)
和setregid(2)
将您的用户ID和组ID重新设置为非特权用户。exec(3)
函数之一来执行您要创建的非特权用户,以便您可以在不使用sudo
的情况下运行此程序,然后使其归超级用户所有并使用root使其成为set- user -ID可执行文件非特权程序现在将以普通权限运行,但当它启动时,它将有一个打开的文件描述符(文件描述符#3),可用于读取您的特殊文件。
对于Windows,它类似,但略有不同:
CreateFile
打开要读取的文件。不要使用默认的安全属性--创建一个bInheritHandle
设置为TRUE
的SECURITY_ATTRIBUTES
结构,以便子进程可以继承该句柄。如果打开文件失败,则打印一条错误消息并退出。CreateProcess
启动子进程。在命令行中传入上面的句柄(例如,打印为数值);您也可以使用use a shared memory region,但这比在此可执行文件中将requireAdministrator
设置为true
时使用此problem.然后,子进程通过解析命令行来获取继承的句柄,然后可以根据需要读取数据。
这种方法的一个问题是,当您继承一个句柄时,您必须使用低级系统调用(在Unix上是read(2)
,在Windows上是ReadFile
)来读取它--您不能使用像C的fread(3)
或C++的iostream
这样的高级函数(好的,Unix有fdopen(3)
,但据我所知,在Windows上没有对应的函数)。
我相信你现在已经注意到了,上面的一切都是用C编写的。在Unix中,这可以非常直接地转换成Python,因为os
module有很多好东西,比如setreuid
、exec*
和fdopen
。在Windows上,您也许可以使用ctypes
模块和/或Pywin32来做一些这样的事情,但是坚持使用C可能更容易一些。
发布于 2011-09-08 21:45:00
您正在寻找的是所谓的权限提升,这在很大程度上取决于您运行的平台。一般来说,你的程序需要做的就是以超级用户的身份运行一部分。例如,在unix系统上,您可能能够使用sudo
读取文件的内容。
但如前所述,这实际上取决于您运行的系统。
发布于 2011-09-08 22:47:40
我会把程序一分为二。
输入一个配置项,描述如何对需要额外权限的命令执行exec
或subprocess
操作。即。
access_special_file: sudo access_special_file
或
access_special_file: runas /user:AccountWithPrivs access_special_file
这会将特权提升的一些系统细节转移到系统shell,在系统shell中可能有更方便的方法来获得所需的权限。
https://stackoverflow.com/questions/7354834
复制相似问题