我有一个Python脚本,我希望能够作为系统用户guybrush
以UID 200和组guybrush
与GID 200一起运行。
目前我的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)。我该怎么做才能解决这个问题?
编辑:如果我将脚本chown到root:root
并运行它,则UID,eUID,GID和eGID都设置为0。
此外,这是在Ubuntu 12.04.4 LTS上。
答案 0 :(得分:5)
好吧,我想到了这一点(并在此过程中学到了一点)。令人尴尬的是,我的初始问题是由我的Python脚本中的拼写错误造成的:我在标签euid
下打印出GID,在标签gid
下打印出eUID。糟糕。
所以eUID和eGID实际设置正确 - 很棒。但是,尽管我在C包装器中使用了setuid
和setgid
,但仍然没有设置UID和GID。
事实证明,这是因为setuid
和setgid
的行为因您是root
而有所不同:如果您是root用户,则致电{{1} },它将您的真实UID和有效UID设置为您传入的任何内容,如果您不是setuid
,则只设置有效UID(source)。因此,我对root
(和setuid
)的使用基本上是禁止操作。
但是,可以使用setgid
和setreuid
来电设置真实的UID和GID:
setregid
运行时,(更正的)Python脚本会产生以下输出:
#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);
}