Из PHP-скрипта я хочу запустить Perl-скрипт. Я могу сделать это нормально из терминала (как пользователь root), но при запуске из моего приложения (пользователь www-данных) я не могу.
При разработке приложения на локальном хосте у меня тоже все получалось, но проблема возникла, когда я переключился на другой сервер.
Моя веб-страница вызывает PHP-скрипт с запросом AJAX POST, который отлично работает для моих других PHP-скриптов, которые не делают вызовов Perl.
Я пробовал следующие команды в моем PHP-скрипте безуспешно:
system("/filepath/file.pl");
exec("/filepath/file.pl");
passthru("/filepath/file.pl");
Журналы Apache на сервере, на котором размещено мое приложение, показывают следующую ошибку:
sh: /file.pl: not found
После запуска следующего кода на моем сервере я вижу, что веб-пользователь рассматривается как www-данные:
ps aux | grep apache
Для тестирования я также установил разрешения для всех файлов и каталогов, используемых моим приложением, чтобы разрешить любой тип доступа любому пользователю, используя chmod 777.
Обратите внимание: мое приложение доступно только определенным пользователям (я использую файл .htaccess для установки этих разрешений и требую, чтобы пользователь входил в систему), поэтому, если есть способ изменить то, как сервер видит этого пользователя (из www-data, в учетные данные вошедшего в систему пользователя) тогда, возможно, это поможет — как бы я это сделал?
Попробуйте что-то вроде этого
exec("/usr/bin/perl /full-path/script.pl",$output);
Спасибо за все предложения! В итоге возникла проблема с настройками безопасности в файле php.ini в каталоге Apache на сервере, на котором размещено мое приложение:
/etc/php5/apache2/php.ini
Безопасный режим был установлен на «on», что не позволяло php-файлам получать доступ / выполнять любые локальные файлы. (Сбой PHP-скрипта при попытке доступа к другому файлу, не являющемуся скриптом: other.html).
Чтобы решить эту проблему, не удаляя параметр безопасного режима для всех приложений на моем сервере, я изменил приведенный выше файл php.ini, добавив в него следующее:
safe_mode: on
safe_mode_include_dir: /filepath
safe_mode_exec_dir: /filepath
Более подробную информацию об этих переменных конфигурации можно найти здесь:
http://php.net/manual/en/ini.sect.safe-mode.php