【问题标题】:Permission Error Writing to a File with Python Script Launched as PHP/www-data使用作为 PHP/www-data 启动的 Python 脚本写入文件的权限错误
【发布时间】:2017-03-12 17:03:56
【问题描述】:

我有一个 index.php 文件,它运行如下 python 脚本:

shell_exec("/usr/custom/test.py")

test.py 文件尝试写入文件(目录中默认不存在)如下:

#!/usr/bin/env python

import io

with io.FileIO("foobar.txt, "w") as file:
    file.write("Hello!")

现在,如果我在 Ubuntu 中直接以 root 身份运行此文件,它可以正常工作。该文件已创建并具有“你好!”里面。

如果我通过 php 脚本运行它(通过访问我的 index.php 页面),我会在 /var/log/apache2/error.log 中收到以下错误

Traceback (most recent call last):
  File "/usr/custom/test.py", line 5, in <module>
    with io.FileIO("foobar.txt", "w") as file:
IOError: [Errno 13] Permission denied: 'foobar.txt'

现在...我尝试了另一个 python 文件,它只打印了一些东西,我能够让它运行良好。所以这就是我感到困惑的地方。

文件夹和test.py文件的权限相同,如下:

-rwxrwxrwx 1 www-data www-data 102

我不明白为什么这不会让我写入文件。我什至尝试先创建文件(触摸),然后授予它权限……但它没有用。

有人知道我怎样才能让它工作吗?

【问题讨论】:

  • 尝试在python中获取文件路径以检查它是否正常工作:在php文件所在的文件夹中创建一些文件,然后在python脚本中写入import osprint(os.path.abspath("filename.txt")) - 什么是输出?
  • 使用$output = shell_exec("/usr/custom/test.py");,然后打印该输出以查看python脚本的结果。
  • 艾敏,我不完全确定我明白你要我做什么。所以我将 import os 和 print(os.path.abspath("filename.txt")) 添加到我的 python test.py 脚本中。我还在与我的 index.php 文件(位于 /var/www/html 中)相同的文件夹中创建了 filename.txt。因此,如果我直接以 root 身份运行我的 python 脚本,它会显示 /var/www/html/filename.txt 至于你的第二条评论,我有 $output = shell_exec("/usr/custom/test.py");打印($输出);但是当我导航到 index.php 文件时,我的网页上没有输出。我也没有在 apache 日志文件中看到任何内容。
  • 我之所以要求在没有完整路径的情况下添加该行是为了检查 python 尝试创建文件的位置。如果如您所说,它检查/usr/custom/ 文件夹,那么这意味着它将尝试在该目录中创建foobar.txt。尝试在打开文件时为foobar.txt 提供完整路径。此外,最好使用with open('/path/to/foobar.txt', 'w') as file 而不是io
  • 另外,当你以 root 执行 python 脚本时,确保它没有创建文件foobar.txt。如果它创建了该文件,由于 root 用户,该文件将需要 root 访问权限才能重写。在这种情况下,删除当前的foobar.txt 文件。

标签: php python apache ubuntu-16.04


【解决方案1】:

当您从 php 调用该脚本时,它会尝试在与 python 文件本身(/usr/custom/)相同的文件夹中创建文件,而不是 php 文件。要解决这个问题,您需要为文件编写绝对路径:

with open('/var/www/html/foobar.txt', 'w') as file:
    file.write("Hello!\n")

如果您需要在与您的 php 文件相同的位置创建该文件,那么您需要在 shell_exec 调用中将 path 作为参数传递。阅读 this 文档以进行参数解析。您可以在 php 中使用getcwd 来获取当前目录的路径。

【讨论】:

  • 谢谢,我可能又节省了几个小时。
猜你喜欢
  • 2015-08-11
  • 2015-02-12
  • 2016-01-31
  • 2018-03-25
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
相关资源
最近更新 更多