栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

由于特权在类似Unix的系统和Windows上的工作方式完全不同,因此您将需要具有特定于平台的代码。无论如何,您都需要将程序分成两个单独的程序,其中一个以提升的权限运行,而另一个以标准/减少的权限运行。

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

  1. 假设您以root身份运行,然后打开文件进行读取。由于您提到文件非常大,因此您实际上并没有读取整个文件,只需保留一个打开的文件描述符。如果打开失败,则打印错误消息并退出。
  2. 使用
    setreuid(2)
    setregid(2)
    将您的用户ID和组ID设置回非特权用户。
  3. 使用
    exec(3)
    功能之一执行无特权的可执行文件。
  4. 如果要制作它而不使用它就可以运行该程序
    sudo
    ,请使其成为root拥有,并使用使其成为set-user-ID可执行文件
    chown root the-program; chmod +s the-program

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

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

  1. 假设您以root身份运行,并使用打开文件以进行读取
    CreateFile
    。不要使用默认的安全属性-创建一个设置为的
    SECURITY_ATTRIBUTES
    结构,以便该句柄将被子进程继承。如果打开文件失败,则打印错误消息并退出。
    bInheritHandle``TRUE
  2. 使用
    CreateProcess
    启动你的孩子的过程。在命令行上传递上方的句柄(例如,打印为数值);您也可以使用共享内存区域,但这要比解决此问题值得的麻烦更多。
  3. 将清单文件嵌入到此可执行文件中,其
    requireAdministrator
    设置为
    true
    。完成此操作后,在运行程序时,会出现一个UAC提示,询问您是否要允许程序进行更改。

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

这种方法的一个问题是,当你继承一个手柄,你必须使用低级别的系统调用(

read(2)
在Unix,
ReadFile
Windows上)从中读取数据-
你不能使用更高级别的功能,像C的
fread(3)
或C
++的
iostream
小号(好的,Unix有
fdopen(3)
,但是据我所知Windows上没有等效的东西)。

正如我敢肯定你现在已经注意到了,上面的一切都已经在C.在Unix中,这种转换非常直截了当成Python,因为

os
模块有很多好吃的东西一样
setreuid
exec*
fdopen
。在Windows上,您可以使用
ctypes
模块和/或Pywin32来完成其中一些工作,但坚持使用C可能更容易。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/662122.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号