2012-07-23 400 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