繁体   English   中英

python脚本的setuid / setgid包装器

[英]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包装程序中使用了setuidsetgid ,但仍未设置UID和GID。

事实证明,这是由于setuidsetgid的行为根据您是否是root而有所不同的:如果您是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脚本中产生以下输出:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM