1 votes

Quelles sont les autorisations nécessaires pour exécuter une commande system() dans un script php script qui écrit dans un dossier ?

J'ai un script php script qui contient la ligne :

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

Le dossier de sortie est défini comme suit :

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

Si je lance le texte exact "ffmpeg -i ......" à partir de l'invite en tant que root, cela fonctionne correctement.

Mais si le script est exécuté, seul un fichier de taille zéro est créé. Une idée sur ce qui pourrait être erroné ?


Édition 1

Je pense avoir localisé le problème à selinux

J'ai essayé la solution recommandée dans 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');

?>

Le résultat est le suivant :

1 
2 
3 

Édition 2

APRÈS avoir désactivé selinux, j'ai obtenu les résultats suivants :

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.

Édition 3

php script :

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

error_log :

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

php script :

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');

error_log :

/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 script :

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');

error_log :

/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

1voto

Julien Vehent Points 2907

Quelques réflexions au hasard :

  • Combien de temps prend votre commande ffpmpeg ? si elle prend plus de temps que la valeur de max_execution_time dans php.ini, je pense que la commande est annulée.

  • essayez d'utiliser uniquement des chemins complets pour le binaire ffmpeg et les fichiers d'entrée/sortie. Cependant, si vous avez un fichier de taille zéro en sortie, cela ne devrait pas être le cas.

  • Apache a-t-il la permission d'exécuter le binaire ffmpeg ?

  • essayez une commande de base dans votre appel système, comme "touch test.txt" juste pour vérifier si le problème vient de ffmpeg ou de votre script php.

-1voto

siliconpi Points 1687

C'était un problème de permissions, j'avais activé selinux. En changeant le paramètre dans /etc/sysconfig/selinux

From: 
SELINUX=enforcing

To:
SELINUX=disabled

Les commandes system() ont commencé à fonctionner

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X