[英]setuid/setgid wrapper for python script
我有一个Python脚本,希望能够作为UID 200的系统用户guybrush
和GID 200的组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
)如下所示:
#include <unistd.h>
#include <sys/types.h>
int main(int argc, char *argv[]) {
setuid(geteuid());
setgid(getegid());
return execv("/path/to/script.py", argv);
}
然后,我对包装器进行编译,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
下的GID和标签gid
下的eUID。 哎呀。
因此,实际上已正确设置了eUID和eGID-太好了。 但是,尽管我在C包装程序中使用了setuid
和setgid
,但仍未设置UID和GID。
事实证明,这是由于setuid
和setgid
的行为根据您是否是root
而有所不同的:如果您是root并调用setuid
,则它将您的真实UID和有效UID设置为您传入的任何内容,如果您不是root
它只是设置有效的UID( source )。 因此,我对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);
}
运行时,这会从(更正的)Python脚本中产生以下输出:
uid: 200
euid: 200
gid: 200
egid: 200
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.