相关: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()
这样的事情,但它没有用
答案 0 :(得分:2)
从最不危险到最危险的顺序。
您可以尝试删除John Zwinck建议的权限。 基本上你会用root级别权限启动程序, 立即执行您需要执行的操作,然后切换到非root用户 用户。
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)
您还可以要求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")
或者您可以以root用户身份运行整个程序 - sudo python myScript.py
。
只有在用户运行脚本时才暂时向用户提供root权限,我唯一能想到的就是在root用户下面运行一些可以暂时授予任何使用者的脚本您的脚本root权限为/ dev / shm。这可以通过使用setuid授予此类权限,然后在一定时间后完成,或者如果脚本结束,则权限被取消。我唯一担心的是,如果有一种方式暂时获得此类权限的用户可能能够获得更长久的权限。