你如何将你的代码临时运行为“root”?

时间:2015-12-15 04:38:43

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

相关: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)

我得到了OSError

  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

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

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

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

编辑(改写问题):

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

1 个答案:

答案 0 :(得分:2)

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

  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

  4. 只有在用户运行脚本时才暂时向用户提供root权限,我唯一能想到的就是在root用户下面运行一些可以暂时授予任何使用者的脚本您的脚本root权限为/ dev / shm。这可以通过使用setuid授予此类权限,然后在一定时间后完成,或者如果脚本结束,则权限被取消。我唯一担心的是,如果有一种方式暂时获得此类权限的用户可能能够获得更长久的权限。