Я занимаюсь разработкой приложения, которое делает что-то за три шага на виртуальной машине в компьютерном движке Google Cloud:
- 1 - принимает данные от пользователя в виде формы
- 2 - передает ввод в файл .php, используя
$_POST[]
, который затем запускает команду shell_exec (после проверки через escapecmd()
) для запуска сценария python (команда sudo python3 A1.py I1 I2 ... IN
), где I1, I2, ... IN
входные данные из формы.
- 3 - Сценарий python записывает вывод в файл .txt, который затем анализируется PHP-скриптом, и вывод выводится.
Так что теперь моя проблема в том, что запуск sudo python3 A1.py I1 I2 ... IN
из терминала работает нормально, так как он обновляет файл tmp.txt, который обновляется в файле PHP, и показывает правильный вывод. Однако, если перейти к самому приложению, если я изменю значения в форме на I1 I2 ... IN
, то будет отображаться тот же вывод, что и ранее, т. Е. На шаге 2 команда shell_exec()
не работает.
Таким образом, команда работает из терминала, но не из команды shell_exec()
в PHP. Выполнение $output = shell_exec($cmd); var_dump($output);
возвращает только значение NULL. Я проверил остальную часть своего кода, все команды, кажется, работают нормально, и значение $ cmd совпадает с тем, что я печатаю в терминале. Я думаю, что это как-то связано с разрешениями, так как я запускаю Apache2 с PHP7.0 в экземпляре Compute Engine.
PHP скрипт:
<?php
...
$path ="sudo python3 A1.py ".$I1." ".$I2." ".$I3." ".$I4;
$command = escapeshellcmd($path);
$output = shell_exec($command);
var_dump($output);//Shows NULL
echo $output;//shows nothing
echo $command."\n";//Shows sudo python3 A1.py I1 I2 I3 I4
$file = file_get_contents('tmp.txt');
echo $file;
...
?>
Ожидаемые результаты - значение выходных данных должно меняться с изменением формы ввода
Фактические результаты - команда изменяется при изменении значений формы ввода, но результат остается таким же, как и при последнем вычислении терминала, и не изменяется при изменении значений входов. Следовательно, shell_exec()
не выполняется должным образом.
Может кто-нибудь сказать мне, как это исправить в инстансе виртуальной машины Linux?