#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