2024-04-25 08:48:02 发布
网友
我必须打开一个系统文件并从中读取。此文件通常只能由根用户(超级用户)读取。我有办法向用户询问超级用户密码。我希望使用此凭据打开文件并从中读取,而不让整个程序作为超级用户进程运行。有没有办法以多平台的方式实现这一点?
您要寻找的是所谓的特权提升,这在很大程度上取决于您运行的平台。一般来说,程序需要做的是以超级用户的身份运行一部分。例如,在unix系统上,您可以使用sudo读取文件的内容。
sudo
但如前所述,这实际上取决于您运行的系统。
我会把程序一分为二。
放置一个配置项,描述如何exec或subprocess需要额外权限的命令。即
exec
subprocess
access_special_file: sudo access_special_file
或者
access_special_file: runas /user:AccountWithPrivs access_special_file
这会将权限提升的一些系统细节卸载到系统外壳程序中,在那里可能有更方便的方法来获得所需的权限。
由于特权在类Unix系统和Windows上的工作方式完全不同,因此需要有特定于平台的代码。在任何情况下,您都需要将程序分为两个单独的程序,一个使用提升的权限运行,另一个使用标准/降低的权限运行。
在类Unix系统(包括Linux和Mac OS X)中,使用提升权限运行的可执行文件应执行以下操作:
chown root the-program; chmod +s the-program
未授权的程序现在将以正常权限运行,但当它启动时,它将有一个打开的文件描述符(文件描述符3),可用于从特殊文件中读取。
对于Windows,它类似但略有不同:
SECURITY_ATTRIBUTES
bInheritHandle
TRUE
requireAdministrator
true
然后,子进程通过解析命令行来获取继承的句柄,然后它可以随心所欲地读入数据。
这种方法的一个问题是,当继承句柄时,必须使用低级系统调用(在{Unix上的CD13>},^ {CD14>}在Windows上)从中读取——不能使用诸如C ^ ^ {CD15>}或C++ ^ {CD16>}s的高级函数(OK,UNIX具有^ {CD17>},但在我所知的Windows上没有等价物)。
我相信您现在已经注意到了,上面的所有内容都是用C语言编写的。在Unix中,这相当直接地转化为Python,因为^{} module有很多优点,比如setreuid、exec*和fdopen。在Windows上,您可以使用ctypes模块和/或Pywin32来完成这些工作,但是使用C可能更容易
setreuid
exec*
fdopen
ctypes
您要寻找的是所谓的特权提升,这在很大程度上取决于您运行的平台。一般来说,程序需要做的是以超级用户的身份运行一部分。例如,在unix系统上,您可以使用
sudo
读取文件的内容。但如前所述,这实际上取决于您运行的系统。
我会把程序一分为二。
放置一个配置项,描述如何
exec
或subprocess
需要额外权限的命令。即或者
这会将权限提升的一些系统细节卸载到系统外壳程序中,在那里可能有更方便的方法来获得所需的权限。
由于特权在类Unix系统和Windows上的工作方式完全不同,因此需要有特定于平台的代码。在任何情况下,您都需要将程序分为两个单独的程序,一个使用提升的权限运行,另一个使用标准/降低的权限运行。
在类Unix系统(包括Linux和Mac OS X)中,使用提升权限运行的可执行文件应执行以下操作:
sudo
即可运行此程序,则将其归root所有,并使用chown root the-program; chmod +s the-program
将其设置为可执行的用户ID。未授权的程序现在将以正常权限运行,但当它启动时,它将有一个打开的文件描述符(文件描述符3),可用于从特殊文件中读取。
对于Windows,它类似但略有不同:
SECURITY_ATTRIBUTES
结构,将bInheritHandle
设置为TRUE
,以便子进程继承句柄。如果打开文件失败,请打印错误消息并退出。requireAdministrator
设置为true
。执行此操作后,当您运行程序时,将收到一个UAC提示,询问您是否希望允许程序进行更改。然后,子进程通过解析命令行来获取继承的句柄,然后它可以随心所欲地读入数据。
这种方法的一个问题是,当继承句柄时,必须使用低级系统调用(在{Unix上的CD13>},^ {CD14>}在Windows上)从中读取——不能使用诸如C ^ ^ {CD15>}或C++ ^ {CD16>}s的高级函数(OK,UNIX具有^ {CD17>},但在我所知的Windows上没有等价物)。
我相信您现在已经注意到了,上面的所有内容都是用C语言编写的。在Unix中,这相当直接地转化为Python,因为^{} module 有很多优点,比如
setreuid
、exec*
和fdopen
。在Windows上,您可以使用ctypes
模块和/或Pywin32来完成这些工作,但是使用C可能更容易相关问题 更多 >
编程相关推荐