Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python脚本的setuid/setgid包装器_Python_Permissions_Wrapper_Elevated Privileges_Setuid - Fatal编程技术网

python脚本的setuid/setgid包装器

python脚本的setuid/setgid包装器,python,permissions,wrapper,elevated-privileges,setuid,Python,Permissions,Wrapper,Elevated Privileges,Setuid,我有一个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.ge

我有一个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()
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char *argv[]) {
    setuid(geteuid());
    setgid(getegid());
    return execv("/path/to/script.py", argv);
}
我尝试的C包装(
scriptwrap.C
)如下所示:

#!/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()
#include <unistd.h>
#include <sys/types.h>

int main(int argc, char *argv[]) {
    setuid(geteuid());
    setgid(getegid());
    return execv("/path/to/script.py", argv);
}
然而,当我运行scriptwrap时,我得到以下输出:

uid: 1000
euid: 1000
gid: 200
egid: 200
因此,出于某种原因,只设置了GID(我的正常UID是1000)。我能做些什么来解决这个问题

编辑:如果我将脚本切换到
root:root
并运行它,UID、eUID、GID和eGID都设置为0

另外,这是在Ubuntu12.04.4LTS上的。

我发现了这一点(并在这个过程中学到了一些东西)。令人尴尬的是,我最初的问题是由Python脚本中的一个输入错误引起的:我正在打印标签
euid
下的GID,以及标签
GID
下的euid。哎呀

因此eUID和eGID实际上设置正确-很好。但是UID和GID仍然没有设置,尽管我在C包装中使用了
setuid
setgid

事实证明,这是由于
setuid
setgid
的行为根据您是否是
root
而有所不同:如果您是root,并且调用
setuid
,它会将您的实际UID和有效UID设置为传入的任何值,如果您不是
root
,它只会设置有效UID()。因此,我对
setuid
(和
setgid
)的使用基本上没有操作

但是,可以通过使用
setreuid
setregid
调用来设置实际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);
}