2012-07-23 401 views
2

我有一個使用django框架和mod_wsgi運行python代碼的apache httpd服務器。 我的view.py我需要做一個子進程調用來執行另一個python文件,在這個過程中需要創建一些目錄。python makedirs權限被拒絕

但是,我得到OSERROR 13:無論我嘗試創建目錄的位置,權限被拒絕。

只在/ tmp中創建目錄是成功的。

任何人都可以指導我如何解決這個問題?

在此先感謝!

編輯: 我在serverfault.com找到了答案。這裏是供參考的 apache2在根目錄下運行,但它分叉在'www-data'組下運行的進程。要創建文件/目錄

sudo mkdir /srv/www/writable 

變化 因此,創建一個目錄組

sudo chgrp www-data /srv/www/writable 

格蘭特組寫訪問

sudo chmod g+w /srv/www/writable 

和你做。現在,您可以使用apache2運行的腳本在此目錄中創建任何文件/目錄。

+0

實現你顯然有一個權限問題,由於正在運行Apache作爲一個用戶帳戶不同於擁有父目錄的用戶帳戶,您正嘗試創建新目錄。 – Keith 2012-07-23 06:00:24

+0

是的,我可以解決這個問題。我使用apt-get安裝了apache,當我做ps aux | grep apache2時,我看到在根用戶下運行的apache2 ... – 2012-07-23 06:19:25

+0

主要的apache線程以超級用戶身份運行,但它通常會切換到另一個用戶,通常是www數據。 – 2012-07-23 06:56:02

回答

0

我在serverfault.com找到了答案。這裏僅供參考

apache2在根目錄下運行,但它分叉在'www-data'組下運行的進程。因此,創建要在其中創建文件的目錄/目錄

須藤的mkdir/SRV /網絡/寫 更改組

須藤chgrp命令www數據/ SRV /網絡/寫 格蘭特組寫訪問

sudo chmod g + w/srv/www /可寫 你就完成了。現在,您可以創建任何文件/使用腳本在這個目錄中的目錄由Apache2的運行

3

也許值得補充說,這也可以在Python

import os 
import pwd 

path = '/var/www/myapp/foo/' 
if not os.path.exists(path): 
     os.makedirs(path) # creates with default perms 0777 
     uid, gid = pwd.getpwnam('root').pw_uid, pwd.getpwnam('www-data').pw_uid 
     os.chown(path, uid, gid) # set user:group as root:www-data 
+0

此外,os.makedirs應該默認情況下在0777設置權限,但我發現這並非總是如此。要明確地做到這一點:os.chmod(path,0777) – igniteflow 2013-01-09 10:42:07

+0

「我發現這並非總是如此」......這是因爲在Unix上創建文件系統對象時,umask應用於創建模式。另外,由於安全原因,0777是一個不好的選擇,這就是爲什麼'umask'存在於第一位。 – arielf 2015-11-05 20:05:24