在我的 Python 脚本中,我执行了一些需要 root 权限的操作。我还创建和写入我不希望由 root 独占但由运行我的脚本的用户拥有的文件。
通常,我使用sudo
. 有没有办法做到以上几点?
在我的 Python 脚本中,我执行了一些需要 root 权限的操作。我还创建和写入我不希望由 root 独占但由运行我的脚本的用户拥有的文件。
通常,我使用sudo
. 有没有办法做到以上几点?
您可以在 uid 之间切换使用os.seteuid()
. 这与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')
这将创建file1
并file3
作为 root,但file2
作为具有 uid 501 的用户。
如果您想确定哪个用户正在调用您的脚本,请sudo
设置两个环境变量:
SUDO_USER
SUDO_UID
分别是调用的用户的用户名和uid sudo
。所以你可以int(os.environ['SUDO_UID'])
使用 with os.seteuid()
。
http://linux.die.net/man/8/sudo引用:
设置真实有效的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