web-dev-qa-db-fra.com

Autorisation php Shell_exec () sur Linux Ubuntu

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?

13
ngoaho91

L'utilisateur d'Apache www-data 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) sudoers le fichier à éditer.
  2. À la fin du fichier, ajoutez l'exemple suivant: -si nous voulons utiliser la commande pour 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

10

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

5
Keiran Holloway

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");
?>
4
slm

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 =
2
X Tian

Comment déboguer les problèmes Shell_exec

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

  • Ouvrez le fichier /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.
  • Ouvrez le terminal de www-data: su www-data
  • Essayez php -v ou tout ce que vous ne pouvez pas exécuter à partir de php. Si cela ne fonctionne pas - Vous verrez des journaux Nice et pourrez déboguer le problème.
  • N'oubliez pas de réparer le fichier /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.

2
Arenim

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
0
Alex