使用Python脚本写入文件的权限错误作为PHP / www-data启动

时间:2017-03-12 17:03:56

标签: php python apache ubuntu-16.04

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

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身份直接运行此文件,它可以正常工作。该文件已创建并具有“Hello!”内部。

如果我通过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

我无法弄清楚为什么这不会让我写入文件。我甚至尝试先创建文件(触摸),然后赋予它权限......但它没有用。

有谁知道如何才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题