Python创建目录时权限被拒绝

3
我有一个运行django框架和mod_wsgi的apache httpd服务器,其中包含python代码。 在我的view.py文件中,我需要调用子进程来执行另一个python文件,并在过程中创建一些目录。
但是,无论我试图在哪里创建目录,都会收到OSERROR 13:Permission denied的错误提示。
只有在/tmp目录中创建目录才成功。
有人可以指导我如何解决这个问题吗?
提前感谢您!!!
编辑: 我在serverfault.com网站上找到了答案。 这里是供参考的答案: apache2在root下运行,但生成的进程运行在“www-data”组下。 因此,在要创建文件/目录的位置创建一个目录即可。
sudo mkdir /srv/www/writable

更改组
sudo chgrp www-data /srv/www/writable

授予该组写入权限

sudo chmod g+w /srv/www/writable

完成了,现在你可以使用一个由apache2运行的脚本在这个目录中创建任何文件/目录。


你显然有一个权限问题,因为Apache运行的用户帐户与您尝试创建新目录的父目录所有者不同。 - Keith
是的,我能看出来。我使用apt-get安装了Apache,当我执行ps aux|grep apache2时,我可以看到Apache2在root用户下运行... - Amm Sokun
主要的Apache线程以root身份运行,但它会派生出子进程,通常切换到另一个用户,一般是www-data。 - Thomas Orozco
是的,我也看到apache2在www-data下运行...这是否意味着我需要将我的目录的所有者/组更改为www-data? - Amm Sokun
2个回答

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

此外,os.makedirs默认应该设置权限为0777,但我发现并非总是如此。要明确执行此操作,请执行:os.chmod(path,0777) - igniteflow
我发现这并不总是正确的,这是因为在Unix上创建文件系统对象时会应用umask到创建模式上。此外,出于安全原因,0777是一个糟糕的选择,这也是为什么umask存在的原因。 - arielf
python os getpwnam 可能已经被弃用,因为它不在文档中。 - aderchox

1

我在serverfault.com找到了答案,以下是参考:

apache2运行在root账户下,但派生的进程则运行在'www-data'用户组下。所以,创建一个目录,用于存储文件或目录。

sudo mkdir /srv/www/writable 更改用户组

sudo chgrp www-data /srv/www/writable 授权该组可写入

sudo chmod g+w /srv/www/writable 完成以上步骤后,现在你可以通过apache2运行的脚本创建任意文件和目录了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接