PHP-файл с сервера с использованием linux [duplicate]

В bfs очередь используется, тогда как в стеке dfs используется для хранения вершин в соответствии с обходом графика. 2- в процессе bfs выполняется уровень до уровня (в соответствии с направленным или неориентированным графиком), тогда как в dfs процесс выполняется до глубины (процесс первого посещения корневого узла, а другой - далеко, а затем применяется обратное отслеживание от последнего узла до корневой узел).

12
задан Marcin Orlowski 30 August 2012 в 16:01
поделиться

4 ответа

посмотрите на /etc/php.ini, там:

; This directive allows you to disable certain functions for security reasons.
; It receives a comma-delimited list of function names. This directive is
; *NOT* affected by whether Safe Mode is turned On or Off.
; http://www.php.net/manual/en/ini.sect.safe-mode.php#ini.disable-functions
disable_functions =

убедитесь, что exec не указан в следующем виде:

disable_functions=exec

Если это так, удалите его и перезагрузите apache.

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

#!/usr/bin/php
ini_set("display_errors", 1);
ini_set("track_errors", 1);
ini_set("html_errors", 1);
error_reporting(E_ALL);

в начало файла, дайте ему разрешения с помощью chmod +x myscript.php и выполните его ./myscript.php. Он очень внимателен, особенно на занятом сервере, который много пишет в файле журнала.

EDIT

Звучит как проблема с разрешениями. Создайте сценарий bash, который делает что-то простое как echo "helo world" и попытается запустить его. Убедитесь, что у вас есть разрешения для файла и папки, содержащей файл. вы можете просто сделать chmod 755 только для тестирования.

10
ответ дан Kuf 16 August 2018 в 01:47
поделиться
  • 1
    disable_functions пуст в моем php.ini, я запускаю сценарий, как вы предлагали, и консоль ничего не показывает. – carcargi 30 August 2012 в 16:09
  • 2
    @Necroside ответ обновлен. – Kuf 30 August 2012 в 16:17
  • 3
    Большое спасибо, трюк, проблема в том, что каким-то образом (поскольку мой клиент имеет доступ к серверу, и он считает, что он эксперт XD), он скопировал и изменил разрешения приложений. Я переместил их обратно в исходную папку и снова настроил путь, теперь все работает, я нашел это при проверке разрешений приложения. Благодарю. – carcargi 30 August 2012 в 16:25
  • 4
    @Necroside Счастливые помочь! – Kuf 30 August 2012 в 16:26
  • 5
    @Necroside он изменил разрешения whoami ?? – Ja͢ck 30 August 2012 в 16:32

Еще несколько заметок.

  • Для отладки всегда завершайте функцию exec / shell_exec в var_dump() .
  • error_reporting(-1); следует как и display_errors, в качестве последнего средства даже set_error_handler("var_dump"); - если только посмотреть, не вызывает ли PHP сам execvp или еще.
  • Используйте 2>&1 (объединить оболочки STDERR в поток STDOUT), чтобы понять, почему вызов не выполняется. В некоторых случаях вам может потребоваться обернуть вашу команду в вызове дополнительной оболочки:
    // capture STDERR stream via standard shell
    shell_exec("/bin/sh -c 'ffmpeg -opts 2>&1' ");
    
    Повторно перенаправить файл журнала, как рекомендовано @Mike, является наиболее рекомендуемым подходом.
  • Альтернативный вариант между различными функциями exec для обнаружения сообщения об ошибках. Хотя они в основном делают то же самое, выходные пути возврата меняются: exec() → либо возвращает результат как результат функции, либо через необязательный параметр $output. Также предоставляет параметр $return_var, который содержит код errno / exit приложения запуска или оболочки. Вы можете получить: ENOENT (2) - Нет такого файла EIO (127) - Ошибка ввода-вывода: файл не найден shell_exec() → то, что вы хотите запускать в основном для выражений в стиле оболочки , Обязательно назначьте / напечатайте возвращаемое значение, например. var_dump(shell_exec("...")); `` встроенные backticks → идентичны shell_exec. system() → аналогичен exec, но всегда возвращает результат как результат функции (распечатайте!). Дополнительно позволяет фиксировать код результата. passthru() → еще одна альтернатива exec, но всегда отправляет любые результаты STDOUT в выходной буфер PHP. Какой из них делает его наиболее подходящей оболочкой exec. popen() или лучше proc_open() → позволяют индивидуально фиксировать STDOUT и STDERR.
  • Большинство ошибок оболочки заканчиваются на PHP или Apache error.log, когда они не перенаправлены. Проверьте свой журнал syslog или Apache, если ничего не дает полезных сообщений об ошибках.

Наиболее распространенными проблемами, возникающими у новичков PHP / LAMP, являются:

  • Как уже упоминалось @Kuf : для устаревших планов веб-хостинга вы все равно можете найти safe_mode или disable_functions. Ни одна из функций exec PHP не будет работать. (Лучше всего найти лучшего поставщика, иначе расследуйте «CGI», но не устанавливайте собственный интерпретатор PHP, пока не развернуты.)
  • Аналогично может быть AppArmor / SELinux / Firejail. Они ограничивают способность каждого приложения создавать новые процессы.
  • Предназначенный двоичный файл не существует. Практически не существует никаких веб-хостов, таких как ffmpeg. Вы не можете просто запускать произвольные команды оболочки без подготовки. Некоторые вещи необходимо установить!
    // Check if `ffmpeg` is actually there:
    var_dump(shell_exec("which ffmpeg"));
    
  • PATH выключен. Если вы установили специальные инструменты, вам необходимо убедиться, что они доступны. Использование var_dump(shell_exec("ffmpeg -opts")) будет искать все распространенные пути - или как было сказано / ограничено Apache (часто просто /bin:/usr/bin). Проверьте с помощью print_r($_SERVER);, что содержит ваш PATH, и если это покрывает инструмент, который вы хотите запустить. Кроме того, вам может потребоваться адаптировать настройки сервера (/ etc / apache2 / envvars) или использовать полные пути:
    // run with absolute paths to binary
    var_dump(shell_exec("/bin/sh -c '/usr/local/bin/ffmpeg -opts 2>&1'"));
    
    Это несколько подрывает концепцию оболочки. Лично я не считаю это предпочтительным. Однако это имеет смысл для целей безопасности; кроме того, для использования пользовательской установки, конечно.
  • Разрешения Для запуска двоичного кода в системе BSD / Linux его нужно сделать «исполняемым». Это то, что делает chmod a+x ffmpeg. Дальнейшее изменение пути к таким пользовательским двоичным файлам должно быть доступно для чтения пользователю Apache, с которым работают ваши скрипты PHP. Более современные настройки используют PHP, встроенные в режим FPM (suexec + FastCGI), где ваша учетная запись веб-хостинга равна тому, с чего работает PHP.
  • Тест с SSH. Это должно быть само собой разумеющимся, но перед запуском команд через PHP тестирование его в реальной оболочке было бы очень разумным. Зонд, например. ldd ffmpeg, если существуют все зависимости lib, и если он работает иначе.
  • Входные значения (GET, POST, имена FILE, пользовательские данные), которые передаются как аргументы команды в строках exec, должны быть экранированы с помощью escapeshellarg() .
    $q = "escapeshellarg";
    var_dump(shell_exec("echo {$q($_GET['text'])} | wc"));
    
    В противном случае вы легко получите синтаксические ошибки оболочки; и, вероятно, использовать код, установленный позже ...
  • Будьте внимательны, чтобы не комбинировать обратные ссылки с любой из функций *exec():
    $null = shell_exec(`wc file.txt`);
                       ↑           ↑
    
    Backticks запускает команду и оставляет shell_exec с выходом уже выполнил команду. Используйте обычные кавычки для обертывания параметра команды.

В Windows:

  • Вызовы CMD не будут хорошо воспроизводиться с потоками STDERR.
  • Определенно попробуйте сценарий Powershell для запуска любых приложений CLI или используйте командную строку, такую ​​как: system ("powershell -Command 'pandoc 2> & amp; 1'");
  • Используйте полные пути и предпочитайте передние косые черты всегда ("C:\Program Files\Whatevs\run.exe" с дополнительными кавычками, если пути содержат пробелы). Слишком быстро работающие чернила также работают в Windows с тех пор, как они были введены в MS-DOS 2.0
  • . Выясните , какая служба и учетная запись SAM выполняются как IIS / Apache, так и PHP. Убедитесь, что у него есть разрешения на выполнение.
  • Обычно вы не можете запускать приложения с графическим интерфейсом. (Типичное обходное решение - вызовы taskcheduler или WMI.)
1
ответ дан mario 16 August 2018 в 01:47
поделиться
  • 1
    Отличный ответ, я удивлен, что у него больше не болит. Принятое решение не так полезно, как этот. – kevinkl3 26 June 2018 в 00:07

Поскольку вы выходите из контекста PHP в собственную оболочку, у вас будет много отладочных проблем.

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

<?php
shell_exec("filename > ~/debug.log 2>&1");

Затем в отдельной оболочке:

tail -200f ~/debug.log

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

6
ответ дан Mike Mackintosh 16 August 2018 в 01:47
поделиться

Вы можете возвращать выходы и код возврата команд exec , токи могут содержать информацию, которая могла бы объяснить проблему ...

exec('my command', $output, $return);
4
ответ дан YohannP 16 August 2018 в 01:47
поделиться
  • 1
    Просто добавил код к вопросу и не заметил этого ответа, он просто показывает это. Error Array ( ) – carcargi 30 August 2012 в 15:45
  • 2
    А что содержит переменную $ return_val? – YohannP 30 August 2012 в 15:47
Другие вопросы по тегам:

Похожие вопросы: