Какие разрешения необходимы для запуска команды system() внутри сценария php, который пишет в папку?

У меня есть PHP-скрипт, который имеет строку:

system("ffmpeg -i ......");

Выходная папка установлена ​​так:

drwxrwxr-x  5 apache apache   4096 Oct 19 07:40 in_upload

Если я запускаю точный текст "ffmpeg -i......" из приглашения от имени пользователя root, он работает нормально.

Но если скрипт выполняется, создается только файл нулевого размера. Есть идеи, что может быть не так?


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

Я думаю, что я локализовал проблему в selinux

Я попробовал решение, рекомендованное в http://www.php.net/manual/en/function.system.php:

<?php
function my_exec($cmd, $input='')
         {$proc=proc_open($cmd, array(0=>array('pipe', 'r'), 1=>array('pipe', 'w'), 2=>a$
          fwrite($pipes[0], $input);fclose($pipes[0]);
          $stdout=stream_get_contents($pipes[1]);fclose($pipes[1]);
          $stderr=stream_get_contents($pipes[2]);fclose($pipes[2]);
          $rtn=proc_close($proc);
          return array('stdout'=>$stdout,
                       'stderr'=>$stderr,
                       'return'=>$rtn
                      );
         }

echo "1 ";
echo shell_exec('ls');
echo "\n2 ";
my_exec('ls');
echo "\n3 ";
my_exec('/bin/ls');

?>

Выход был:

1 
2 
3 

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

После отключения selinux я получил следующие результаты:

echo "1 ";
echo shell_exec('ffmpeg');
echo "\n2 ";
echo system('ffmpeg');
echo "\n3 ";
echo exec('ffmpeg');
===> None worked

echo "1 ";
echo shell_exec('/usr/bin/ffmpeg');
echo "\n2 ";
echo system('/usr/bin/ffmpeg');
echo "\n3 ";
echo exec('/usr/bin/ffmpeg');
===> None worked

echo "1 ";
echo shell_exec('ls');
echo "\n2 ";
echo system('ls');
echo "\n3 ";
echo exec('ls');
===> All 3 worked as expected.

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

PHP скрипт:

echo "1 ";
echo shell_exec('touch test1.txt');
echo "\n2 ";
echo system('touch test2.txt');
echo "\n3 ";
echo exec('touch test3.txt');

журнал ошибок:

touch: cannot touch `test1.txt': Permission denied
touch: cannot touch `test2.txt': Permission denied
touch: cannot touch `test3.txt': Permission denied

PHP скрипт:

echo "1 ";
echo shell_exec('/bin/touch test1.txt');
echo "\n2 ";
echo system('/bin/touch test2.txt');
echo "\n3 ";
echo exec('/bin/touch test3.txt');

журнал ошибок:

/bin/touch: cannot touch `test1.txt': Permission denied
/bin/touch: cannot touch `test2.txt': Permission denied
/bin/touch: cannot touch `test3.txt': Permission denied

PHP скрипт:

echo "1 ";
echo shell_exec('/bin/touch /var/www/html/beta/test1.txt');
echo "\n2 ";
echo system('/bin/touch /var/www/html/beta/test2.txt');
echo "\n3 ";
echo exec('/bin/touch /var/www/html/beta/test3.txt');

журнал ошибок:

/bin/touch: cannot touch `/var/www/html/beta/test1.txt': Permission denied
/bin/touch: cannot touch `/var/www/html/beta/test2.txt': Permission denied
/bin/touch: cannot touch `/var/www/html/beta/test3.txt': Permission denied

2 ответа

Несколько случайных мыслей:

  • Сколько времени занимает ваша команда ffpmpeg? если это займет больше времени, чем значение max_execution_time в php.ini, я считаю, что команда отменяется.

  • Попробуйте использовать только полные пути для двоичного файла ffmpeg и файлов ввода / вывода. Хотя, если у вас есть файл нулевого размера, это не должно быть так.

  • Имеет ли apache разрешение на запуск двоичного файла ffmpeg?

  • попробуйте выполнить базовую команду в вашем системном вызове, такую ​​как "touch test.txt", просто чтобы убедиться, что проблема в ffmpeg или в вашем php-скрипте.

Это была проблема с разрешениями, у меня был включен selinux. Изменяя настройки в /etc/sysconfig/selinux

From: 
SELINUX=enforcing

To:
SELINUX=disabled

Команды system() начали работать

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