Autorisation php shell_exec () sur Linux Ubuntu

13

Je développe une application php en utilisant un serveur Linux. Mon problème est en cours d'exécution 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?

ngoaho91
la source

Réponses:

10

L'utilisateur d'Apache www-datadoit 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 en etc/sudoers. Pour ce faire, en utilisant sudo visudodans le terminal, il duplique le sudoersfichier (temp) à éditer.
  2. À la fin du fichier, ajoutez l'ex suivant: -si nous voulons utiliser la commande pour le restartsmokeping et la phpcommande 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 restartet phputiliser les privilèges de super utilisateur (root). Et vous utilisez la phpcommande dans le usr/bin/chemin d'accès)

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 ALLcommandes, très dangereux.

www-data ALL=NOPASSWD: ALL

3. Après avoir édité le fichier sudoers (par visudonous éditons le fichier temporaire sudoersafin de sauvegarder et quitter le fichier temporaire (visudo) pour écrire dans le sudoersfichier. ( wq!)

4.C'est tout, utilisez maintenant exec()ou shell_execde la manière suivante dans votre xxx.phpscript. n'oubliez pas d'utiliser sudoavant d' utiliser 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 à l' step no (2.)ajout et modifiez votre script php comme vous le souhaitez.

voici le même problème que le vôtre /programming//a/22953339/1862107

Thusitha Sumanadasa
la source
Cette question ne concerne pas l'utilisation de sudo.
tricasse
C'est formulé si mal
Barney Chambers
5

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

Keiran Holloway
la source
echo shell_exec ("/ usr / bin / php -v"); ne fonctionne pas.
ngoaho91
quand vous dites «ne fonctionne pas», qu'obtenez-vous? C'est à dire, des erreurs? Quelque chose dans vos journaux d'erreurs php / apache? Si la page est vierge, voir la source vous donne quelque chose avec quoi travailler? Malheureusement, le terme «ne fonctionne pas» ne nous donne rien avec quoi travailler ...
Keiran Holloway
@ ngoaho91 - généralement les journaux le sont /var/log/httpd/error*.
slm
: D j'ai une page blanche, rien à voir. où est le fichier journal des erreurs php / apache?
ngoaho91
@ ngoaho91 - de quelle distribution Linux s'agit-il? CentOS, Ubuntu?
slm
4

Vous souhaitez généralement spécifier des chemins complets pour des applications telles que whoami, lset 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");
?>
slm
la source
j'exécute votre commande. tapez php => php est / usr / bin / php. mais la commande de chemin complet me renvoie toujours une page vierge.
ngoaho91
Et si vous faites ceci echo shell_exec("/usr/bin/php somefile.php 2>&1"):?
slm
echo shell_exec ("/ usr / bin / php index.php 2> & 1") => / usr / bin / php: erreur de relocalisation: / usr / bin / php: symbole X509_free, version OPENSSL_1.0.0 non définie dans le fichier libcrypto. so.1.0.0 avec référence de temps de liaison
ngoaho91
OK, le serveur Web (Apache) fonctionne généralement comme un autre utilisateur, non hu. Donc , vous devez vous assurer que le script phptente d'exécution est fixé comme suit: chmod 755 somescript.php. Cela permettra à l'utilisateur sous lequel Apache est exécuté, d'être en mesure d'exécuter et de lire votre .phpfichier.
slm
1
@ ngoaho91 - tout devrait bien se passer maintenant, cette erreur me dit qu'il y a quelque chose de mal avec votre configuration Apache / PHP. freetutorialssubmit.com/php-relocation-error/2221
slm
2

Votre php.ini restreint-il le jeu de commandes disponible?

C'est de ma /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 =
X Tian
la source
non, mon ini comme le vôtre
ngoaho91
2

Comment déboguer les problèmes shell_exec

OK, nous avons ici 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 l' yournameutilisateur et php est exécuté depuis www-data. Donc, la première idée est d'ouvrir le terminal depuis l' www-datautilisateur et d'essayer la même commande. Donc....

  • Ouvrez le /etc/passwdfichier, recherchez la ligne avec l' www-datautilisateur et changez son shell de connexion (le dernier) de /bin/false(ou autre) en/bin/bash .
  • www-dataTerminal ouvert :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 de beaux journaux et pourrez déboguer le problème.
  • N'oubliez pas de réparer le /etc/passwdfichier 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_errorset tous les autres indicateurs pour voir les erreurs dans le navigateur. Ils Vous pouvez les lire et les déboguer.

  • Obtenez www-datale shell (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é à partir de 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.

Arenim
la source
0

Pour moi, le moyen le plus simple était d'aller dans le php.ini et de commenter la ligne qui commence par

disable_functions
Alex
la source