file-io - 在 python 中,以超级用户身份打开文件

  显示原文与译文双语对照的内容
58 2

我必须打开一个系统文件并从里面读取。这里文件通常只能由 root ( 。super 用户) 读取。我有办法向用户询问超级用户密码。我想使用这个凭据来打开文件并从它中读取,而不是使整个程序作为超级用户进程运行。有什么方法可以以多平台方式实现这一点?

时间:原作者:0个回答

128 5

因为特权在unix和 Windows 上完全不同,所以需要具有平台特定的代码。在任何情况下,你都需要将程序分解为两个独立的程序,它的中一个运行的权限与标准/减少。

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

  • 假设你正在运行 root 并打开文件进行读取。因为你提到文件非常大,所以实际上不会读取整个文件,只是保留一个打开的文件描述符。如果打开失败,则打印错误消息并退出。
  • 将用户ID和组ID设置为非特权用户,使用 setreuid(2)setregid(2)
  • 使用一个 exec(3) 用户定义函数执行非特权执行。
  • 如果你想使它能够运行这个程序而不使用 sudo,那么使它由 root 拥有并使它的成为set-user-ID可以执行文件。chown root the-program; chmod +s the-program

非特权程序现在运行正常权限,但当启动时,它将有一个打开的文件描述符( 文件描述符 #3) ) 。

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

  • 假设你正在运行 root 并打开文件以使用 CreateFile 读取文件。不要使用默认的安全属性--创建一个 SECURITY_ATTRIBUTES 结构,使用 bInheritHandle 设置为 TRUE,这样句柄就会被子进程继承。如果打开文件失败,请打印错误消息并退出。
  • 使用 CreateProcess 插件启动子进程。在 命令行 上传递上面的句柄( 比如 。打印为数值) ;你也可以使用共享内存区域( ),但这比这个问题要麻烦。
  • 在这里可执行文件中嵌入一个清单,并将 requireAdministrator 设置为 TRUE执行这里操作后,当你运行该程序时,会询问你是否要允许程序进行更改。

子进程然后通过解析 命令行 获取继承的句柄,然后可以以在数据中读取它。

这种方法的一个问题是当你继承句柄时,你必须使用低级系统来读取它,你不能像( 。read(2) 上的,Windows 上的ReadFile ) 或者 C++ ( 好的,Unix有 fdopen(3),但是在我知道的情况下,Windows 上没有等效的)的fread(3) 那样使用高级的函数。

我相信你已经注意到了,上面的一切都是在C 中。在Unix中,这非常直接地转换为 python,因为 os MODULE 插件有许多像 setreuidexec*fdopen 这样的东西。在 Windows 上,可以以使用 ctypes MODULE 和/或者 Pywin32,进行一些操作,但可以能更容易使用C 。

原作者:
...