python脚本的setuid/setgid包装器

2024-06-28 11:07:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python脚本,我希望能够作为uid200的系统用户guybrush和gid200的组guybrush运行。在

目前,我的Python脚本(位于/path/to/script.py)如下所示:

#!/usr/bin/env python2
import os

print "uid: %s" % os.getuid()
print "euid: %s" % os.getgid()
print "gid: %s" % os.geteuid()
print "egid: %s" % os.getegid()

我尝试的C包装器(scriptwrap.c)如下所示:

^{pr2}$

然后编译、chown和chmod包装器,如下所示:

$ gcc scriptwrap.c -o scriptwrap
$ chown guybrush:guybrush scriptwrap
$ chmod 6755 scriptwrap

但是,当我运行scriptwrap时,我得到以下输出:

uid: 1000
euid: 1000
gid: 200
egid: 200

因此,由于某些原因,只有GID被设置(我的正常UID是1000)。我能做些什么来解决这个问题?在

编辑:如果我选择脚本到root:root并运行它,UID、eUID、GID和eGID都设置为0。在

另外,这是在Ubuntu 12.04.4 LTS上。在


Tags: 脚本uidosrootchmodprintgidchown
1条回答
网友
1楼 · 发布于 2024-06-28 11:07:20

好吧,我弄明白了(在这个过程中我学到了一些东西)。令人尴尬的是,我最初的问题是由Python脚本中的一个错误引起的:我打印出标签euid下的GID和标签{}下的eUID。哎呀。在

所以eUID和eGID设置正确-太好了。但是UID和GID仍然没有设置,尽管我在C包装中使用了setuid和{}。在

结果表明,这是由于setuid和{}的行为不同,这取决于您是否是{},如果您是root用户并调用setuid,它会将您的实际UID和有效UID设置为传入的任何内容,如果您不是root,它只设置有效UID(source)。所以我使用setuid(和setgid)基本上没有操作。在

但是,可以通过使用setreuidsetregid调用来设置真正的UID和GID:

#include <unistd.h>
#include <sys/types.h>

int main(int argc, char *argv[]) {
    setreuid(geteuid(), geteuid());
    setregid(getegid(), getegid());
    return execv("/path/to/script.py", argv);
}

这将在运行时从(已更正的)Python脚本中生成以下输出:

^{pr2}$

相关问题 更多 >