10

在我的 Python 脚本中,我执行了一些需要 root 权限的操作。我还创建和写入我不希望由 root 独占但由运行我的脚本的用户拥有的文件。

通常,我使用sudo. 有没有办法做到以上几点?

4

3 回答 3

12

您可以在 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')

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

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

SUDO_USER
SUDO_UID

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

于 2013-03-29T16:16:06.897 回答
1

http://linux.die.net/man/8/sudo引用:
设置真实有效的uid和gid以匹配目标用户

因此,知道使用哪个用户的唯一选择是从配置文件或 cmdline 选项中读取目标用户,或者以某种方式进行启发式猜测。

一个好主意是所谓的权利脱落:从 root 权限开始,然后按照你的要求去做。然后成为特权较低的用户。
您将为此使用 os 模块:http: //docs.python.org/2/library/os.html#os.setuid

于 2013-03-29T16:04:00.733 回答
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
于 2017-01-14T09:28:36.190 回答