你如何临时 运行 你的代码为 '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()
的事情,但它没有用
编辑(改写问题):
- 假设用户名 A r/w 可以访问目录 A
- 您是用户 B,您的程序需要访问目录 A。您如何 运行 用户 A 的程序?
从最不危险到最危险的顺序。
您可以按照 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)
您还可以要求 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
.
至于仅当用户 运行 您的脚本时才临时授予用户对 /dev/shm 的 root 权限,我唯一能想到的就是在 运行 中添加一些脚本root 用户下的后台可以临时授予任何使用您的脚本 root 权限的人 /dev/shm。这可以通过使用 setuid 授予此类权限,然后在一定时间后或者如果脚本结束,权限将被取消来完成。我唯一担心的是,是否有办法让暂时获得此类权限的用户获得更永久的权限。
相关: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()
的事情,但它没有用
编辑(改写问题):
- 假设用户名 A r/w 可以访问目录 A
- 您是用户 B,您的程序需要访问目录 A。您如何 运行 用户 A 的程序?
从最不危险到最危险的顺序。
您可以按照 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)
您还可以要求 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
.
至于仅当用户 运行 您的脚本时才临时授予用户对 /dev/shm 的 root 权限,我唯一能想到的就是在 运行 中添加一些脚本root 用户下的后台可以临时授予任何使用您的脚本 root 权限的人 /dev/shm。这可以通过使用 setuid 授予此类权限,然后在一定时间后或者如果脚本结束,权限将被取消来完成。我唯一担心的是,是否有办法让暂时获得此类权限的用户获得更永久的权限。