在写入文件夹的 php 脚本中运行 system() 命令需要什么权限?

在写入文件夹的 php 脚本中运行 system() 命令需要什么权限?

我有一个 php 脚本,其中包含以下行:

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

输出文件夹设置为:

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

如果我以 root 身份在提示符下运行精确文本“ffmpeg -i ......”,它可以正常工作。

但如果运行该脚本,则只会创建一个大小为零的文件。您知道可能出了什么问题吗?


编辑1

我认为问题已经定位到 selinux

我尝试了推荐的解决方案http://www.php.net/manual/en/function.system.php#94929

<?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

答案1

一些随机想法:

  • 您的 ffpmpeg 命令需要多长时间?如果它花费的时间比 php.ini 中的 max_execution_time 值还要长,我认为该命令已被取消。

  • 尝试仅使用 ffmpeg 二进制文件和输入/输出文件的完整路径。但是,如果您输出的文件大小为零,则不应该这样。

  • apache 是否有权限运行 ffmpeg 二进制文件?

  • 在系统调用中尝试一个基本命令,例如“touch test.txt”,以检查问题是否来自 ffmpeg 或 php 脚本。

答案2

这是权限问题,我启用了 selinux。通过更改 /etc/sysconfig/selinux 中的设置

From: 
SELINUX=enforcing

To:
SELINUX=disabled

system() 命令开始工作

相关内容