Как запустить скрипт на Python с использованием PHP и создать файл? - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь POC запустить скрипт Python в серверной части, реализованной на PHP. Веб-сервер Apache в контейнере Docker.

Это код PHP:

$command = escapeshellcmd('/usr/local/test/script.py');
        $output = shell_exec($command);
        echo $output;

Когда я выполняю скрипт python с использованием серверной части, мы получаем ошибку отказа в разрешении для создания файла.

Мой скрипт на питоне:

#!/usr/bin/env python

file = open("/tmp/testfile.txt","w+")

file.write("Hello World")

file.close()

Это ошибка, которую я получаю:

IOError: [Errno 13] Отказано в доступе: 'testfile.txt'

Для каталога, с которым я работаю, права доступа следующие:

drwxrwsr-x 2 1001 www-data 4096 8 мая 05:35.

drwxrwxr-x 3 1001 1001 4096 3 мая 08:49 ..

Есть мысли по этому поводу? Как мне преодолеть эту проблему?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Я считаю, что проблема в том, что вы пытаетесь записать существующий файл в каталоге /tmp/. Обычно /tmp/ будет иметь установленный бит разрешений. Это означает, что только владелец файла имеет разрешение на запись или удаление его. Групповые разрешения на запись для файлов не имеют значения, если в родительском каталоге установлен бит закрепления.

Так что, если это содержимое вашего / tmp

$ ls -al /tmp

drwxrwxrwt  5 root  root       760 Apr 30 12:00 .
drwxr-xr-x 21 root  root      4096 Apr 30 12:00 ..
-rw-rw----  2 1001  www-data    80 May  8 12:00 testfile.txt

Мы можем предположить, что пользователи в группе www-data должны иметь возможность писать в testfile.txt. Но это не так, поскольку . (сам каталог / tmp /) имеет установленный бит закрепления (это указывает t в разделе прав доступа).

Причина, по которой этот бит установлен, заключается в том, что каждый должен иметь возможность записывать туда файлы, но не должен беспокоиться о том, что другие пользователи могут изменять наши временные файлы.

Чтобы избежать ошибок прав доступа, вы можете использовать стандартный модуль tempfile . Этот код создаст уникальное имя файла, например testfile.JCDxK2.txt, поэтому не имеет значения, существует ли testfile.txt.

#!/usr/bin/env python

import tempfile

with tempfile.NamedTemporaryFile(
        mode='w',
        prefix='testfile.',
        suffix='.txt',
        delete=False,
    ) as file:
    file.write("Hello World")
0 голосов
/ 08 мая 2018

Для начала невероятно плохая практика иметь относительные пути в любой среде сценариев. Начните с переписывания кода, чтобы использовать полный путь, такой как /usr/local/test/script.py и /tmp/testfile.txt. Полагаю, ваш сценарий пытается написать в другом месте, чем вы думаете.

Когда вы точно знаете , где именно записываются файлы, перейдите в каталог и запустите ls -la и проверьте разрешения для каталога. Вы хотите, чтобы он был доступен для записи тому же пользователю или группе, что и веб-сервер.

Глядя на разрешения, которые вы показали, у вас нет возможности записи в каталог, только для всех и для группы. Вам необходимо добавить права на запись для пользователя - chmod u+w /tmp выполнит эту работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...