0

相關:Python multiprocessing: Permission denied你如何以'root'的身份臨時運行你的代碼?

我想用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()但它沒有工作

編輯(改寫的問題):

  • 假設用戶名的有目錄中的
  • R/W訪問您是用戶B,您的程序需要訪問目錄A.您如何以用戶A的身份運行程序?
+3

你不應該試圖讓你的代碼以root身份運行。解決方案是使用root訪問權限根據您鏈接的問題永久修復您的系統。 –

+0

@JohnZwinck你能回答這個問題的編輯部分嗎?我只是在想一個案例不涉及根 – ealeon

+1

相關(?):[在Python中刪除根權限](http://stackoverflow.com/questions/2699907/dropping-root-permissions-in-python) –

回答

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用戶是 inputed到腳本,然後只使用他們時,他們都需要 。

    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. 或者你可以只運行整個程序作爲根用戶 - sudo python myScript.py

至於暫時給用戶root權限到/ dev/shm的,只有當它們運行腳本,我能想到的唯一的事情就是有,在root用戶下在後臺運行一些腳本,可以暫時將任何使用腳本root權限的人授予/ dev/shm。這可以通過使用setuid來授予這樣的權限,然後在一段時間之後完成,或者如果腳本結束,權限被取走。我唯一擔心的是,如果暫時獲得這種權限的用戶有辦法獲得更多永久權限。

相關問題