【问题标题】:python makedirs permission denied [closed]python makedirs权限被拒绝[关闭]
【发布时间】:2012-07-21 08:43:04
【问题描述】:

我有一个使用 django 框架和 mod_wsgi 运行 python 代码的 apache httpd 服务器。 我的 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 以不同于拥有您尝试在其中创建新目录的父目录的用户帐户运行。
  • 是的,我可以做到这一点。我使用 apt-get 安装了 apache,当我执行 ps aux|grep apache2 时,我看到 apache2 在 root 用户下运行...
  • 主 apache 线程以 root 身份运行,但它派生出通常切换到另一个用户的子节点,通常是 www-data。
  • 是的,我还看到 apache2 在 www-data 下运行...这是否意味着我需要将目录的所有者/组更改为 www-data?

标签: python apache mkdir


【解决方案1】:

可能值得补充的是,这也可以在 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)
  • “我发现情况并非总是如此” .... 这是因为在 Unix 上,umask 在创建文件系统对象时应用于创建模式。另外,出于安全原因,0777 是一个糟糕的选择,这就是为什么 umask 会排在第一位。
  • python os getpwnam 可能已被弃用,因为它不在文档中
【解决方案2】:

我在 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 运行的脚本在此目录中创建任何文件/目录

【讨论】:

    猜你喜欢
    • 2015-11-08
    • 2015-12-02
    • 1970-01-01
    • 2016-06-13
    • 2015-08-05
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多