在Python中删除特定操作的root权限

在我的Python脚本中,我执行了一些需要root权限的操作。 我也创build并写入文件,我不想由root用户独占,而是由正在运行脚本的用户拥有。

通常,我使用sudo运行我的脚本。 有没有办法做到以上?

Solutions Collecting From Web of "在Python中删除特定操作的root权限"

你可以使用os.seteuid()在uid之间切换。 这与os.setuid()不同,因为您可以在需要时返回获取root权限。

例如,以root身份运行以下命令:

 import os open('file1', 'wc') # switch to userid 501 os.seteuid(501) open('file2', 'wc') # switch back to root os.seteuid(0) open('file3', 'wc') 

这将创建file1file3作为根,但是file2作为具有uid 501的用户。

如果你想确定哪个用户正在调用你的脚本, sudo设置了两个环境变量:

 SUDO_USER SUDO_UID 

分别是用户名和sudo用户的uid。 所以你可以使用int(os.environ['SUDO_UID'])os.seteuid()一起使用。

http://linux.die.net/man/8/sudo报价:
真正有效的uid和gid被设置为匹配目标用户的uid和gid

所以,你唯一的选择就是从配置文件或cmdline选项中读取目标用户,或者通过启发式猜测来读取目标用户。

一个好主意就是所谓的权利流失:从root权限开始,然后执行你所要的内容。 然后成为一个较少特权的用户。
你可以使用os模块: http : //docs.python.org/2/library/os.html#os.setuid

我发现使用os.seteuid和os.setegid实际上并没有删除root权限。 在给他们打电话之后,我仍然可以做需要root权限的事情。 我发现的解决方案是使用os.setresuid和os.setresgid来代替:

 sudo_uid = int(os.getenv("SUDO_UID")) sudo_gid = int(os.getenv("SUDO_GID")) # drop root privileges os.setresgid(sudo_gid, sudo_gid, -1) os.setresuid(sudo_uid, sudo_uid, -1) subprocess.call("mkdir /foo1", shell = True) # should fail # regain root privileges os.setresgid(0, 0, -1) os.setresuid(0, 0, -1) subprocess.call("mkdir /foo2", shell = True) # should succeed