Ошибка отказа в разрешении при попытке заставить apache запускать Python через PHP в Linux

#php #html #linux #apache #shell

#php #HTML #linux #apache #оболочка

Вопрос:

Мне нужен способ выполнить «python3.8 createfile.py » скрипт на моем сервере Linux через веб-интерфейс html. В будущем мне понадобится это также для извлечения данных формы из веб-интерфейса HTML для предоставления в качестве аргументов команде оболочки, поэтому метод должен быть расширяемым до этого, но я не ищу эту часть решения прямо сейчас

Я использую метод PHP exec_shell, но Python выдает ошибку:

 [Errno 13] Permission denied: '/var/www/html/ytr/output/createfile_2020-10-16_203623.txt'
  

Я использую apache (httpd) на моем CentOS linux VPS.

ytr/index.html

 <! -- Version 0.10 -->
<form action="/ytr/testexec.php">
    <input type="submit" value="Open Script">
</form>
  

ytr/testexec.php

 // version 0.10
<?php
$log = shell_exec("python3.8 /var/www/html/ytr/createfile.py");
echo "<pre>Erorr log: $log</pre>";
//header('Location: http://xxx.xxx.xxx.94/ytr/index.html?success=true');
//x's are of course real numbers.
?>
  

ytr/createfile.py

 from datetime import datetime
import os
# version 0.10
# Maybe its going to be woring directory

scr_dir = os.path.dirname(os.path.realpath(__file__))   "/output/"
fin_name = scr_dir   "createfile_"   
    datetime.now().strftime("%Y-%m-%d_%H%M%S"   ".txt")

try:
    fin = open(fin_name, "w")
    fin.write("Today is "   str(datetime.now()))
except Exception as e:
    print(e)
  

Все файлы работают должным образом в одиночку. index.html отображается правильно при доступе через интернет-браузер; при вызове через интерфейс командной строки Linux, testexec.php успешно выполняется createfile.py , который затем успешно выполняется (создание файла в ytr / output); ручной вызов «python3.8 createfile.py » в Linux CLI также работает хорошо.

Когда я нажимаю кнопку «Открыть скрипт» на своей странице, файл не отображается в ytr / output, и я получаю следующее: ошибка, отображаемая в веб-интерфейсе

Как ни странно, нет сообщения об ошибке, которое содержалось бы в $log в PHP-скрипте.

Вещи, которые я пробовал:

  • Повторные попытки. Я поместил пользователя ‘apache’ в группу ‘web’. Установите для группы всех файлов и папок в ytr значение «web» и присвоите группе разрешения rwx (чтение, запись, выполнение). Для тестирования я даже установил другие (o) разрешения для rwx. Вот информация из CLI: lid, ls -l и getfacl CLI выводит
  • Обновление PHP до версии 7.3.23 и перезагрузка сервера Linux.

Заранее благодарю вас!

PS Если есть другое (не php) решение, которое могло бы запускать команду bash из html, с возможностью получения параметров из веб-интерфейса в будущем, я был бы рад его использовать!

Комментарии:

1. Вы пробовали использовать полный путь к интерпретатору python? $log = shell_exec("/path/to/python3.8 /var/www/html/ytr/createfile.py");

2. Скрипт Python начинает выполняться, как мы видим, первый оператор print() возвращает вывод в веб-интерфейс, поэтому Python запускается успешно

3. проверьте разрешения файла журнала, если вы запустите его, как вы говорите, все файлы работают правильно в одиночку, и все сработало, тогда был бы создан этот файл журнала, принадлежащий пользователю, который не был бы www-data .. затем вы идете и пытаетесь запустить его с помощью apache, и www-data не работает.файл не принадлежит, поэтому не может в него записывать .. удалите файл, разрешите www-data записывать в выходной каталог, а затем должен работать

4. @tink Я пытался. Все та же ошибка

5. @LawrenceCherone Привет, спасибо за ваше предложение. Я не уверен, где я могу найти эти журналы. В любом случае, пользователь www-data не завершает работу в моей системе. вывод cls: [ninjatxas@brikas ytr] $ sudo usermod -a -G web www-data [sudo] пароль для ninjatxas: usermod: user ‘www-data’ не существует

Ответ №1:

Я решил это сам. Проблема была вызвана SELinux.

Сначала посмотрите, есть ли в вашей системе SELinux:

 sestatus
  

Чтобы временно отключить его и посмотреть, является ли это вашей проблемой, запустите:

 sudo setenforce 0
  

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

Комментарии:

1. Лучшее решение для каждого отказа в разрешении apache