gpt4 book ai didi

python - python 脚本的 setuid/setgid 包装器

转载 作者:太空狗 更新时间:2023-10-30 01:08:10 25 4
gpt4 key购买 nike

我有一个 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)。我该怎么做才能解决这个问题?

编辑:如果我将脚本chown到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

关于python - python 脚本的 setuid/setgid 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24541427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com