PHP - Как узнать, разрешает ли сервер shell_exec

На некоторых серверах PHP не разрешено запускать команды оболочки через shell_exec. Как я могу определить, позволяет ли текущий сервер запускать команды оболочки через PHP или нет? Как я могу включить выполнение команд оболочки через PHP?


person arxoft    schedule 05.02.2014    source источник
comment
How can I enable shell commands execution via PHP? Только в корневой конфигурации. Это функция безопасности.   -  person Pekka    schedule 05.02.2014
comment
Та же проблема с моей стороны   -  person Khawar Islam    schedule 08.10.2019


Ответы (2)


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

is_callable('shell_exec') && false === stripos(ini_get('disable_functions'), 'shell_exec');

Этот общий подход работает для любой встроенной функции, поэтому вы можете обобщить ее:

function isEnabled($func) {
    return is_callable($func) && false === stripos(ini_get('disable_functions'), $func);
}
if (isEnabled('shell_exec')) {
    shell_exec('echo "hello world"');
}

Обратите внимание на использование stripos, потому что имена функций PHP нечувствительны к регистру.

person bishop    schedule 05.02.2014
comment
И вам, вероятно, следует проверить, включен ли безопасный мод. - person Christopher Will; 05.02.2014
comment
@ChristopherWill:Безопасный режим устарел в версии 5.3 и вызывает фатальную ошибку в версии 5.4, поэтому я его не включал. Я что-то упустил, не включив его (за исключением, очевидно, ‹= 5.2, но это EOL)? - person bishop; 05.02.2014
comment
Ах, я даже не знал, что это устарело. Спасибо за обновления. Думаю, это все. - person Christopher Will; 05.02.2014

Вы можете проверить доступность самой функции:

if(function_exists('shell_exec')) {
    echo "exec is enabled";
}

Кстати: есть ли особое требование использовать «shell_exec», а не «exex»?

php.net

Note:
This function can return NULL both when an error occurs or the program 
produces no output. It is not possible to detect execution failures using 
this function. exec() should be used when access to the program exit code 
is required.

ИЗМЕНИТЬ №1

Как указал DanFromGermany, вы, вероятно, проверяете, является ли он исполняемым. Что-то вроде этого сделает это

if(shell_exec('echo foobar') == 'foobar'){
    echo 'shell_exec works';
}

РЕДАКТИРОВАНИЕ №2

Если приведенный выше пример может привести к появлению предупреждений, вы можете сделать это более подходящим способом. Просто см. этот ответ SO.

person Christopher Will    schedule 05.02.2014
comment
Нет. Функция отключена, но она есть. Это не работает. - person Daniel W.; 05.02.2014
comment
@bishop Да, вы совершенно правы. Вот почему я обновил свой ответ и вставил ссылку на хороший ответ SO. - person Christopher Will; 05.02.2014