在我的Python脚本中,我执行了一些需要root权限的操作。我还创建和写入我不希望由root独占但由运行我的脚本的用户拥有的文件。
通常,我使用sudo
运行我的脚本。有办法做到吗?
答案 0 :(得分:11)
您可以使用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')
这会以root用户身份创建file1
和file3
,但以uid 501为用户创建file2
。
如果要确定哪个用户正在调用脚本,sudo
会设置两个环境变量:
SUDO_USER
SUDO_UID
分别是调用sudo
的用户的用户名和用户名。因此,您可以使用int(os.environ['SUDO_UID'])
与os.seteuid()
一起使用。
答案 1 :(得分:1)
http://linux.die.net/man/8/sudo引用:
真实有效的uid和gid设置为与目标用户的相匹配
因此,您知道使用哪个用户的唯一选择是从配置文件或cmdline选项中读取目标用户,或者启发式猜测。
一个好主意是所谓的权利流失:从root权限开始,然后执行你所需要的权限。然后成为权限较低的用户。
你可以使用os模块:
http://docs.python.org/2/library/os.html#os.setuid
答案 2 :(得分: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