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:
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
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.
Quelques hypothèses, il se peut que votre utilisateur de processus de serveur Web ne dispose pas des privilèges nécessaires.
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 .
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
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.
L'utilisateur www-data
de Apache doit disposer de privilèges pour exécuter certaines applications à l'aide de Sudo
.
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. 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.php
script .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.
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.
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.
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.