为什么这个使用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
错误是什么?
答案 0 :(得分:19)
只允许具有CAP_SETGID
功能的超级用户或进程设置GID。 setuid()
调用后,有效UID不再为0,因此不允许您拨打setgid()
。尝试重新排序这两个电话。
答案 1 :(得分:2)