你如何临时 运行 你的代码为 'root'?

How do you temporary run your code as 'root'?

相关: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 中的权限外,有没有办法在代码中 运行 作为根用户?

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

编辑(改写问题):

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

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

    来自 this Whosebug.

    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 用户下的后台可以临时授予任何使用您的脚本 root 权限的人 /dev/shm。这可以通过使用 setuid 授予此类权限,然后在一定时间后或者如果脚本结束,权限将被取消来完成。我唯一担心的是,是否有办法让暂时获得此类权限的用户获得更永久的权限。