【问题标题】:Drop/Enable Root Privilege Opening File in Python在 Python 中删除/启用根权限打开文件
【发布时间】:2012-10-27 22:32:08
【问题描述】:

在 /tmp 中打开文件时,我遇到了关于放弃 root 权限的问题。这是有问题的行:

open(filepath, 'wb')

当程序不使用 sudo 命令运行时,一切正常,这里是我 so os.stat 时的权限

posix.stat_result(st_mode=17407, st_ino=261652, st_dev=64512L, st_nlink=206, st_uid=1000, st_gid=1000, st_size=12288, st_atime=1352314677, st_mtime=1352316340, st_ctime=1352316340)

使用 sudo 命令运行程序时遇到问题。我尝试通过以下方式放弃特权

os.setegid(int(os.getenv("SUDO_GID")))
os.seteuid(int(os.getenv("SUDO_UID")))

并使用

重新启用它们
os.seteuid(0)
os.setegid(0)

错误信息是

IOError: [Errno 13] Permission denied:

os.stat 产量

posix.stat_result(st_mode=17407, st_ino=261652, st_dev=64512L, st_nlink=204, st_uid=1000, st_gid=1000, st_size=4096, st_atime=1352314677, st_mtime=1352316329, st_ctime=1352316329)

理想情况下,我希望通过相应地删除并启用 root 权限来运行特定功能,就好像用户从未调用过 sudo 一样。

【问题讨论】:

标签: python root


【解决方案1】:

您可能需要在以某种方式产生的进程中从 root 更改,因为如果您删除 root,您将无法再次将其取回。您可以尝试为此使用 os.fork()。

import os


def drop_permissions():
    os.setegid(int(os.getenv("SUDO_GID")))
    os.seteuid(int(os.getenv("SUDO_UID")))


def call_without_permissions(func, *args, **kw):
    in_parent = os.fork()
    if not in_parent:
        drop_permissions()
        func(*args, **kw)
        os._exit(0)
    else:
        os.waitpid(0)

【讨论】:

  • 您介意将我链接到一些演示如何执行此操作的示例代码吗?
  • 现在正在做一些事情。但是,它实际上不会运行,您必须自己实现一些东西,例如您已经准备就绪的现有用户更改器。
  • 感谢您的代码。我是否使用上述代码正确删除/启用权限?在这种情况下,由于我们正在分叉,我什至需要重新启用 root 权限吗?
  • 我认为您正在正确更改 UID 和 GID。不,您不需要重新启用root;你的主进程永远不会失去根。
  • 我试过你的代码,但不幸的是它没有解决原来的问题。我想知道这是否与我没有正确更改权限有关。
猜你喜欢
  • 2018-08-16
  • 1970-01-01
  • 2011-02-11
  • 2020-11-19
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多