【问题标题】:Drop root privileges for certain operations in Python在 Python 中删除某些操作的 root 权限
【发布时间】:2013-03-20 06:49:07
【问题描述】:

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

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

【问题讨论】:

  • 如果您使用sudo 运行,您可以在完成后随时将chown 发送给__FILE__ 的所有者
  • @uʍopǝpısdn 是的......但是如果你不小心的话,这样做很快就会变得不礼貌。
  • 我没听明白,抱歉。它是创建所有文件的根目录(sudo 的结果)。如何检索运行我的脚本的用户 ID?

标签: python linux root sudo privileges


【解决方案1】:

您可以使用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 创建为root,但file2 作为uid 501 的用户。

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

SUDO_USER
SUDO_UID

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

【讨论】:

  • 请注意,这只适用于同一进程中的操作。如果你 fork 另一个进程(即通过使用子进程),它会继承 ruid 并以这些权限运行。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这是因为您正在分叉新进程。这些新进程正在继承 ruid。对于同一进程中的操作,一切都会好起来的(例如 open())
    猜你喜欢
    • 2011-02-11
    • 2011-03-22
    • 1970-01-01
    • 2018-03-14
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多