8

为什么这个使用 os.setuid()/gid() 的简单程序会失败?是用 python 编写的,但我认为这不是与语言相关的问题(最后都是相同的 posix 系统调用):

import os, pwd

if os.getenv("SUDO_UID") and os.getenv("SUDO_GID"):
  orig_uid=int(os.getenv("SUDO_UID"))
  orig_gid=int(os.getenv("SUDO_GID"))
else:
  pw = pwd.getpwnam("nobody")
  orig_uid = pw.pw_uid
  orig_gid = pw.pw_gid

print os.getuid(), os.getgid(), os.geteuid(), os.getegid(), orig_uid, orig_gid

os.setgid(orig_gid)
os.setuid(orig_uid)

它返回此异常:

$ sudo python provgid.py 
0 0 0 0 1000 1000
Traceback (most recent call last):
  File "provgid.py", line 15, in <module>
    os.setgid(orig_gid)
OSError: [Errno 1] Operation not permitted

错误是什么?

4

2 回答 2

25

CAP_SETGID只允许超级用户或具有该能力的进程设置 GID。调用后setuid(),有效的 UID 不再为 0,因此无法调用setgid()。尝试重新排序这两个调用。

于 2011-01-14T15:37:22.110 回答
2

我已经修复了使用这个库

http://pypi.python.org/pypi/privilege/1.0

这安全地将权限从 root 删除到另一个用户。

于 2011-01-15T17:18:42.713 回答