【问题标题】:How do you temporary run your code as 'root'?您如何临时以“root”身份运行代码?
【发布时间】:2016-03-20 18:31:46
【问题描述】:

相关:Python multiprocessing: Permission denied

我想用 Python 的 multiprocessing.Pool

import multiprocessing as mp
pool =  mp.Pool(3)
for i in range(num_to_run):
    pool.apply_async(popen_wrapper, args=(i,), callback=log_result)

我得到操作系统错误

  File "/usr/local/lib/python2.6/multiprocessing/__init__.py", line 178, in RLock
    return RLock()
  File "/usr/local/lib/python2.6/multiprocessing/synchronize.py", line 142, in __init__
    SemLock.__init__(self, RECURSIVE_MUTEX, 1, 1)
  File "/usr/local/lib/python2.6/multiprocessing/synchronize.py", line 49, in __init__
    sl = self._semlock = _multiprocessing.SemLock(kind, value, maxvalue)
OSError: [Errno 13] Permission denied

我在相关问题中读到这是由于 /dev/shm 没有 r/w

除了更改/dev/shm中的权限之外,有没有办法在代码中以root身份运行?

我最初以为你可以做类似os.umask() 的事情,但它没有用

编辑(重新表述问题):

  • 假设用户名 A 对目录 A 具有 r/w 访问权限
  • 您是用户 B,您的程序需要访问目录 A。您如何以用户 A 的身份运行程序?

【问题讨论】:

  • 您不应该尝试让您的代码以 root 身份运行。解决方案是根据您链接的问题使用 root 访问永久修复您的系统。
  • @JohnZwinck 你能回答问题的编辑部分吗?我只是在想一个与root无关的案例
  • @ealeon:所涉及的用户是什么并不重要。只需修复/dev/shm 上的权限即可。我在这里没有看到任何缺点。
  • @JohnZwinck 问题是......除了修复权限之外还有其他方法吗?你的答案是否定的,对吗?还是有其他方法...?

标签: python multiprocessing python-2.x python-multiprocessing


【解决方案1】:

按照从最不危险到最危险的顺序。

  1. 您可以尝试按照 John Zwinck 的建议删除权限。 基本上你会以root级别的权限启动程序, 立即做你需要做的,然后切换到非root 用户。

    来自this StackOverflow

    import os, pwd, grp
    
    def drop_privileges(uid_name='nobody', gid_name='nogroup'):
    if os.getuid() != 0:
    # We're not root so, like, whatever dude
    return
    
    # Get the uid/gid from the name
    running_uid = pwd.getpwnam(uid_name).pw_uid
    running_gid = grp.getgrnam(gid_name).gr_gid
    
    # Remove group privileges
    os.setgroups([])
    
    # Try setting the new uid/gid
    os.setgid(running_gid)
    os.setuid(running_uid)
    
    # Ensure a very conservative umask
    old_umask = os.umask(077)
    
  2. 您还可以要求 root 用户的凭据 输入到脚本中,然后只在它们被使用时使用它们 必填。

    subprocess.call("sudo python RunStuffWithElevatedPrivelages.py")
    #From here, the main script will continue to run without root permissions
    

    或者,如果您不希望脚本提示用户输入密码,您可以这样做

    subprocess.call("echo getRootCredentials() | sudo -S python RunStuffWithElevatedPrivelages.py")
    
  3. 或者您可以以 root 用户身份运行整个程序 -- sudo python myScript.py

至于仅在用户运行您的脚本时临时授予用户对 /dev/shm 的 root 权限,我唯一能想到的就是有一些脚本在 root 用户下在后台运行,可以临时授予使用的任何人您对 /dev/shm 的脚本 root 权限。这可以通过使用 setuid 授予此类权限,然后在一定时间后或脚本结束时取消权限来完成。我唯一担心的是,是否有办法让临时获得此类权限的用户能够获得更多永久权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多