3

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

open(filepath, 'wb')

当程序未使用 sudo 命令运行时,一切正常,这是我如此 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 一样。

4

1 回答 1

2

您可能需要在以某种方式产生的进程中从 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)
于 2012-11-07T19:48:52.270 回答