2013-03-29 34 views
10

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

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

+0

如果你使用'sudo'运行,你可以随时'后您chown'到'__FILE__'的所有者大功告成 – slezica

+0

@uʍopǝpısdn是的......但这样做这样的事情很快就变得活泼,如果你不小心。 – thejh

+0

我没有明白,对不起。创建所有文件的根源('sudo'的后果)。我如何检索运行脚本的用户的用户ID? –

回答

10

可以UID的使用os.seteuid()之间切换。这不同于os.setuid()中,你可以回去获得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()使用。

1

http://linux.die.net/man/8/sudo报价:
的真实和有效的UID和GID设置为匹配目标用户的

所以,你只需要知道使用哪个用户的选择是,无论是从配置读取目标用户文件或cmdline选项,或某种方式的启发式猜测。

一个好主意就是所谓的权利流失:从root权限开始,然后执行你为他们定义的权限。然后成为一个权限较低的用户。
你会使用os模块为: http://docs.python.org/2/library/os.html#os.setuid

1

我发现使用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