2013-09-03 2 views
0

Есть ли причина, по которой я не могу выполнить файлы в функции shell_exec/exec/system в PHP?Почему shell_exec не выполняет файлы, а выполняет простые команды?

Пример то, что делает работу в командной строке и shell_exec функция РНР:

<?php 
$data = shell_exec("ls"); 
echo $data; 
?> 

Пример чего-то, что не работает в shell_exec функции PHP, но будет работать в командной строке (я могу подтвердить, что):

<?php 
$data = shell_exec("./c-compiled-file argv1 argv2 argv3"); 
echo $data; 
?> 

Есть ли что-нибудь, что я могу сделать на моем сервере, чтобы это сработало? Я повсюду искал, и никаких решений, которые я нашел, не было исправлено. Скомпилированный файл находится в том же каталоге, что и скрипт PHP, он просто не выполнит его. Также, если вы спрашиваете, да, я пробовал это с SSH2, и он все равно не будет выполнен.

Также PHP не находится в безопасном режиме, и функции NO отключены.

+0

Вы должны иметь + х режим на файле 'CHMOD + х./С-скомпилированных file' или' CHMOD 777./С-скомпилированных file' –

+0

Мы говорим о том же пользователя и такой же рабочий каталог? –

+0

Скомпилированный скрипт находится в той же папке, что и скрипт PHP, выполняющий выполнение оболочки. – user2484373

ответ

0

Вы хотите использовать system во втором случае, а не shell_exec.

system выполняет внешнюю программу и отображает выходной сигнал.

shell_exec выполняет команду через оболочку и возвращает полный вывод в виде строки.

и для хорошей меры:

exec просто выполняет внешнюю программу.

Кроме того, вы хотите убедиться, что ваша внешняя программа является исполняемой, и (хотя вы заявили об этом, я это повторю) это разрешение на выполнение для пользователя, который запускает веб-сервер. Вы также хотите убедиться, что каталог, в котором работает ваша внешняя программа, имеет возможность записывать в его каталог или/tmp или какой-либо другой выходной каталог, который вы установили.

Наконец, вы должны всегда использовать абсолютные пути для выполнения таких вещей в cron или php или что-то еще ... поэтому не используйте ./c-compiled-file argv1 argv2 argv3, но вместо этого используйте /home/username/c-compiled-file argv1 argv2 argv3 или что бы то ни было, полный путь.

+0

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

0

Просто предположим, но двоичный файл, который вы пытаетесь выполнить, может не иметь надлежащих разрешений. Предоставляя его с ./ в командной строке, он заставляет его выполнять, но PHP, вероятно, удаляет его в целях безопасности. Попробуйте это:

chmod +x c-compiled-file 
+0

Да Я также установил правильные разрешения на путь. – user2484373

1

Некоторые общие сбои при выполнении внешних команд из PHP, которые работают отлично от оболочки:

  • Команда использует относительные пути, но PHP запускается из любого места:

    • Использование getcwd()/chdir() для ввода/установки рабочего каталога
       
  • PHP и shell работают с разными учетными данными пользователя. Это часто случается, когда PHP работает через веб-сервер.

  • PHP и shell запускают разные команды. Многие люди называют вещи вроде exec("foo $bar") и даже не проверяют, что содержит "foo $bar".

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

    • Вы можете перенаправить stderr to sdtout
    • Вы можете использовать функцию PHP, которая позволяет захватывать больше информации, такой, как exec()
       
  • Веб-сервер запрещен, чтобы выполнить команду в эксплуатации системного уровня.

    • Поиск для SELinux или аналогичных инструментов.