Je développe une application php en utilisant un serveur Linux. Mon problème est d'exécuter Shell_exec()
pour appeler un fichier exe ne fonctionne pas (en fait pas exe, c'est une sorte de fichier exécutable linux)
echo Shell_exec("whoami");
J'ai un démon
echo Shell_exec("ls")
J'ai un nom de fichier mais
echo Shell_exec("php -v")
Je n'ai rien, une page blanche
echo Shell_exec("php ....bla bla bla")
une page blanche aussi.
Toutes ces commandes si je tape sur le terminal (utilisateur hu) fonctionneront. J'ai cherché sur Google pendant plusieurs heures, les gens disent cela à cause de la permission. Je n'ai pas d'expérience sous Linux. Que dois-je faire pour exécuter mon programme en php?
L'utilisateur d'Apache www-data
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) sudoers
le fichier à éditer.restart
smokeping et php
pour une autre action dans votre question,www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, usr/bin/php
(Cela suppose que vous souhaitez exécuter les commandes restart
et php
en utilisant les privilèges de super utilisateur (root). Et vous utilisez la commande php
dans le chemin usr/bin/
)
Cependant, si vous souhaitez exécuter chaque application en utilisant les privilèges de super-utilisateur, ajoutez ce qui suit au lieu de ce qui est ci-dessus. Vous ne voudrez peut-être pas le faire, 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 temp de sudoers
donc sauvegardez et quittez le fichier temp (visudo) pour écrire dans sudoers
fichier. (wq!
)
4.C'est tout, utilisez maintenant exec()
ou Shell_exec
De la manière suivante dans votre script xxx.php
. n'oubliez pas d'utiliser Sudo
avant l'utilisation de la commande dans le script php.
ex:-
exec ("Sudo /etc/init.d/smokeping restart 2>&1");
ou
Shell_exec("Sudo php -v");
Donc, dans votre problème, ajoutez les commandes que vous souhaitez utiliser dans la step no (2.)
lorsque j'ajoute et modifie votre script php comme vous le souhaitez.
voici le même problème que le vôtre https://stackoverflow.com/a/22953339/1862107
Essayez de spécifier le chemin complet vers le binaire php. Par exemple, /usr/bin/php
Si vous ne le connaissez pas, trouvez-le en utilisant: which php
Vous souhaitez généralement spécifier les chemins d'accès complets aux applications telles que whoami
, ls
et php
. Si vous n'êtes pas sûr de l'emplacement d'un programme (chemin complet), vous pouvez le découvrir comme suit:
$ type php
php is /usr/bin/php
Précisez-le ensuite ainsi dans votre script.
<?php
echo Shell_exec("/usr/bin/php ....bla bla bla");
?>
Votre php.ini restreint-il le jeu de commandes disponible?
C'est de mon /etc/php5/php.ini
; When safe_mode is on, only executables located in the safe_mode_exec_dir
; will be allowed to be executed via the exec family of functions.
; http://php.net/safe-mode-exec-dir
safe_mode_exec_dir =
OK, ici nous avons un problème: quelque chose fonctionne dans le terminal et ne fonctionne pas dans Shell_exec de php (ou exec, spawn, peu importe). Pensons: quelle est la différence entre vous et php? En voici trois:
PHP est exécuté à partir des règles du serveur HTTP
En effet, votre terminal fonctionne depuis yourname
utilisateur et php est exécuté depuis www-data
. Donc, la première idée est d'ouvrir le terminal de l'utilisateur www-data
Et d'essayer la même commande. Donc....
/etc/passwd
, Recherchez la ligne avec l'utilisateur www-data
Et changez son shell de connexion (le dernier) de /bin/false
(Ou autre) en /bin/bash
.www-data
: su www-data
/etc/passwd
Pendant que vous avez terminéPHP est exécuté à partir de PHP.
PHP est enogh paranoïaque et il y a beaucoup d'options dans la configuration Apache/nginx et php.ini qui peuvent briser votre tentative.
C'est un peu plus compliqué à déboguer. Il y a deux options ici:
Activez les journaux dans le navigateur et voyez le problème. Modifiez votre php.ini
, Activez display_errors
Et tous les autres indicateurs pour voir les erreurs dans le navigateur. Ils Vous pouvez les lire et les déboguer.
Obtenez le shell de www-data
(Voir la première section) et exécutez quelque chose comme
echo '<?php Shell_exec("php -v"); ?>' | php
qui exécutera le même code php dans la console et vous pourrez voir les erreurs et le débogage.
PHP est exécuté depuis SELinux/apparmor
Selinux et apparmor sont des éléments de sécurité qui interdisent aux applications d'effectuer des actions spécifiques (par exemple, la génération d'autres applications ou certaines autres applications spécifiques). Il est peut-être activé sur votre serveur.
Pour vérifier - désactivez selinux/apparmor et vérifiez si le problème existe.
Pour corriger - lisez le manuel approprié et corrigez les règles permissives d'écriture pour votre cas.
Pour moi, le moyen le plus simple était d'aller à l'intérieur du php.ini et de commenter la ligne qui commence par
disable_functions