web-dev-qa-db-fra.com

PHP exec () n'exécutera pas la commande Shell lorsqu'il sera exécuté via le navigateur

J'ai un certain script PHP qui appelle exec () pour exécuter une commande permettant de convertir un PDF au format JPG. Cette commande fonctionne très bien dans bash.

Pour anticiper vos suppositions de dépannage initiales, notez les points suivants:

  • safe_mode = Off
  • L'autorisation sur le répertoire contenant PDF et le script est définie sur 777; ce répertoire est également l'emplacement où le fichier JPG est en cours d'écriture.
  • La commande que je passe à exec () pointe explicitement sur le binaire utilisé (par exemple,/usr/local/bin/convert).
  • display_errors = On
  • error_reporting = E_ALL
  • disable_functions = [vide]
  • Je fais écho à la sortie de exec () et elle ne renvoie rien. La commande en cours d'exécution par défaut ne renvoie rien.

Lorsque j'appelle ce script PHP à partir du navigateur (visitez http://www.example.com/script.php ), exec () n'exécute pas son argument.

IMPORTANT: Je sais qu'il n'y a pas de problème avec mon script ni avec la manière dont j'ai construit la commande bash, car depuis bash, je peux exécuter le script avec 'php' et cela fonctionne (par exemple, 'script php. php 'convertit le fichier)

J'ai également essayé de commuter exec () avec system ().

Enfin, j'ai déjà eu ce problème une fois dans le passé, mais je ne me souviens pas comment je l'ai résolu.

Je sais que quelque chose me manque, alors j'espère que quelqu'un d'autre en a eu l'expérience et se souvient de la façon de le réparer!

Merci d’avance pour toute aide que vous pouvez fournir.

Alex

32
Alex

Ajoutez 2>&1 à la fin de votre commande pour rediriger les erreurs de stderr vers stdout. Cela devrait faire comprendre ce qui ne va pas.

68
Greg

Quelques hypothèses, il se peut que votre utilisateur de processus de serveur Web ne dispose pas des privilèges nécessaires.

6
TomHastjarjanto

Comme cela fonctionne lorsque, depuis la ligne de commande (qui se trouve sous votre propre compte utilisateur), il me semble que le compte sur lequel le serveur Web est exécuté (souvent "www-data") ne dispose pas des autorisations d'exécution sur le programme de conversion .

5
Chad Birch

Avez-vous envisagé les autorisations de fichiers? Dans le navigateur, php s'exécute sous un utilisateur, mais lorsque vous l'exécutez sous bash, il s'exécute probablement avec vos autorisations utilisateur.

C'est la première chose que je vérifierais.

Amy

3
Amy Anuszewski

Votre utilisateur Apache/webserver dispose-t-il des droits nécessaires pour exécuter la commande Shell? 

Lorsque vous exécutez à partir de cl, vous utilisez probablement un autre utilisateur, ce qui peut expliquer lequel cl fonctionne mais pas le navigateur.

2
ConroyP

L'utilisateur www-data de Apache doit disposer de privilèges pour exécuter certaines applications à l'aide de Sudo.

  1. Exécutez la commande Sudo visudo. En fait, nous voulons éditer le fichier dans etc/sudoers.Pour ce faire, en utilisant Sudo visudo dans le terminal, il duplique (temp) le fichier sudoers à éditer. 
  2. A la fin du fichier, ajoutez l’exemple suivant: -si nous voulons utiliser la commande pour redémarrer smokeping et la commande mount pour une autre action,

www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount

(Cela suppose que vous souhaitiez exécuter les commandes restart et mount en utilisant les privilèges de super utilisateur (Root).)

Cependant, si vous souhaitez exécuter chaque application avec les privilèges super-utilisateur , Ajoutez ce qui suit au lieu de ce qui précède. Vous pourriez ne pas vouloir faire cela, pas pour les commandes ALL, très dangereux.

www-data ALL=NOPASSWD: ALL

3 .Après avoir édité le fichier sudoers (par visudo, nous éditons le fichier temporaire de sudoers afin d'enregistrer et de quitter le fichier temporaire (visudo) afin d'écrire dans le fichier sudoers. (wq!)

4.C'est le cas, utilisez maintenant exec() de la manière suivante dans votre xxx.phpscript .keep n'oubliez pas d'utiliser Sudo avant la commande utilisée dans le script php.

ex:-

exec ("Sudo /etc/init.d/smokeping restart 2>&1");

Donc, dans votre problème, ajoutez les commandes que vous souhaitez utiliser dans la fonction step no (2.) que j'ajoute et modifiez votre script php comme vous le souhaitez. 

1

Cela peut être dû aux différents utilisateurs exécutant le script via le serveur Web et le script via bash.

Normalement, les scripts/exec invoqués via le serveur, comme avec l'utilisateur 'www', n'ont pas d'accès en écriture à votre zone mais lorsque vous exécutez le script sous bash, vous disposez des droits en écriture.

1
user235044

J'ai déterminé qu'il s'agissait d'un problème avec ImageMagick, pas avec PHP. J'essaie quelques correctifs et s'ils ne fonctionnent pas, je vais utiliser une bibliothèque partagée PHP (probablement imagick) pour effectuer le travail à la place.

0
Alex

Le périphérique de sortie par défaut est modifié.

login en tant que www (après l'activation) donne la sortie via Shell, mais pas via php.

0
Rudger