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.
просто не существует
Я думаю, что 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-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, вероятно, отключены, как отмечали другие пользователи.
<?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!