php-fpm не работает exec, system, shell_exec, только CLI

php-fpm, nginx exec при использовании .phpfiles() shell_exec()system() отлично работает из командной строки.

Пример, когда работает хорошо:

#php myphp.php

myphp.php содержит:

<?php
exec('ping -c 3 google.com', $output);
print_r($output);
?>

Но если я поставлю на свой браузер http://localhost/myphp.php, это больше не работает.

Есть идеи? Я редактирую

Я сделал файл со следующим содержанием:

#cat info.php

<?php
if(function_exists('exec')) {
    echo "exec is enabled";
}
    phpinfo();
?>

В моем браузере распечатать

exec включен, y php info..

Я сделал файл со следующим содержанием:

#cat info.php

<?php 
// Check for safe mode
if( ini_get('safe_mode') ){
    // Do it the safe mode way
echo "Do it the safe mode way";
}else{
    // Do it the regular way
echo "Do it the regular way";
}

?>

В моем браузере распечатать

Делай это обычным способом

Разве я не хотел знать, нахожусь ли я в тюрьме?

В моем php ini

#cat /etc/php-5.5.ini

safe_mode не отображается, либо ON, либо OFF. просто не существует

4 ответа

Я думаю, что exec и подобные функции отключены в вашем php.ini. Вы можете проверить это по

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

Откройте ваш php.ini и перейдите в раздел disable_functions

Если exec указан там, удалите его.

Затем перезагрузите php-fpm,

Также, если включен безопасный режим, эта функция будет недоступна. Вы должны отключить это.

редактировать

используйте полный путь для пинга. Вы можете найти его, введя эту команду в оболочке which ping

редактировать

<?php
exec('/sbin/ping -c3 google.com', $output);
print_r($output);
?>

<?php
//echo "Вот-вот... ещё 1 мин";
//echo "Wait... 1 min";
echo exec('/bin/bash --login -c "cd /var/www/194.7.2.2/public && /usr/local/rvm/rubies/ruby-2.5.3/bin/ruby work1.rb "'.$_GET['some_value']);

Это сработало 4me!

Php-fpm по умолчанию привязан к OpenBSD. Это, вероятно, причина, по которой вы видите, что он работает в сети, а не в сети.

У вас есть два решения. Отключить chroot (прокомментируйте строку chroot = /var/www на /etc/php-fpm.conf) или исправьте проблемы, с которыми вы можете столкнуться.

Статически скомпилированная версия ping находится в /bin/ping (изнутри chroot). Вам нужно будет скопировать /etc/hosts а также /etc/resolv.conf внутри chroot, чтобы разрешить имена хостов (как вы пытаетесь сделать пинг Google). Все остальные системные команды, которые вы планируете вызывать, также должны быть скопированы в chroot (вместе с их общими библиотеками или скомпилированы статически).

использование ldd(1) чтобы узнать, какие библиотеки вам понадобятся. В зависимости от того, чего вы пытаетесь достичь, это может быть утомительной работой.

Exec, system и shell_exec, вероятно, отключены, как отмечали другие пользователи.

Потратив несколько часов на отладку. это разрешило мины.

  1. Редактировать /etc/php/7.4/fpm/pool.d/www.conf

  2. Раскомментируйте и настройте эти строки:

    env[PATH] =/usr/local/bin:/usr/bin:/bin:/add_your_executable_files_path_here

    env[TMP] = /tmp

    env[TMPDIR] = /tmp

    env[TEMP] = /tmp

  3. Перезапустите php-fpm service php7.4-fpm restart

Окружающая среда

nginx, php-fpm7.4, debian 9.13

Другие вопросы по тегам