我有一个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
)如下所示:
然后编译、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上。在
好吧,我弄明白了(在这个过程中我学到了一些东西)。令人尴尬的是,我最初的问题是由Python脚本中的一个错误引起的:我打印出标签}下的eUID。哎呀。在
euid
下的GID和标签{所以eUID和eGID设置正确-太好了。但是UID和GID仍然没有设置,尽管我在C包装中使用了}。在
setuid
和{结果表明,这是由于}的行为不同,这取决于您是否是{},如果您是root用户并调用
setuid
和{setuid
,它会将您的实际UID和有效UID设置为传入的任何内容,如果您不是root
,它只设置有效UID(source)。所以我使用setuid
(和setgid
)基本上没有操作。在但是,可以通过使用
setreuid
和setregid
调用来设置真正的UID和GID:这将在运行时从(已更正的)Python脚本中生成以下输出:
^{pr2}$相关问题 更多 >
编程相关推荐