7
votes

Php exécuté () ne fonctionne pas correctement

J'ai des difficultés avec la fonction PHP Exec (). Il semble ne pas appeler certaines fonctions. Par exemple, le code Echo Exec ('ls'); ne produit aucune sortie que ce soit (il devrait, il existe des fichiers dans le répertoire). Cette raison principale que c'est un problème pour moi, c'est que j'essaie d'exécuter un .jar à partir d'un appel PHP Exec ().

Autant que je sache que je appelais le programme Java correctement, mais je ne reçois pas n'importe laquelle de la sortie. Le .jar peut être exécuté à partir de la ligne de commande sur le serveur. (Pour l'enregistrement, c'est un serveur Apache).

mon php pour l'exécution .jar ressemble à ceci: xxx

Tout ce que je reçois pour la sortie de Cet appel EXEX () est tableau () .

J'ai eu le succès avec Exec () exécutant 'whoami' et 'pwd' . Je ne peux pas comprendre pourquoi certaines fonctions travaillent et certaines ne sont pas. Je ne suis pas la personne la plus expérimentée avec PHP non plus, alors je ne suis pas trop sûr de diagnostiquer le problème. Toute aide et toute aide serait appréciée.


13 commentaires

Quelle est l'erreur exacte? Et aussi, vous voudrez peut-être utiliser quelque chose comme celui-ci: nouveau bufferedwriter (nouveau FileWriter (nouveau fichier ("Out.txt")));


L'erreur est en réalité une exception FilenotFoundException pour OUT.TXT. Je crois comprendre que le fichier n'est pas créé, pourquoi on ne se trouve pas.


Vous devrez peut-être également modifier les autorisations du répertoire que le pot tente d'écrire le fichier. Pas seulement les autorisations du fichier JAR lui-même.


Ouais, ça me semble comme ça. Vous pouvez également essayer de s'enrouler avec un fichier.


@Alexlynch hey, cela a fonctionné - maintenant le .jar exécute de la ligne de commande sans problème. Je vais l'essayer dans PHP maintenant et mettre à jour ma question.


@Matts Avez-vous résolu le problème? Je suis intéressé par où vous avez mal tourné.


@Alexlynch je n'ai pas. J'ai poursuivi ma recherche d'Internet, mais je n'ai rien trouvé. C'est assez frustrant, surtout parce que j'ai trouvé plusieurs exemples où les gens semblent avoir le même code que je le fais, sauf que cela fonctionne pour eux.


@Matts L'avez-vous réduit avec succès du tout? Le fichier JAR est-il définitivement exécuté? PHP n'est-il pas correctement intercepté la production du programme? Si le fichier JAR ne fonctionne pas du tout, je soupçonnerais certainement qu'il y aurait une erreur d'autorisations quelque part. Je ne pense vraiment pas que votre problème est quelque chose d'évident. Vous devriez un peu en dehors de la boîte; Essayez peut-être de donner la voie complète vers le fichier JAR? Peut-être mettre à jour votre message avec un peu plus de code et décrivant ce que vous avez essayé vous donnera, ou l'un de nous, un moment d'EUREKA.


@AlexLynch Je pense que, parce que le fichier Out.txt ne s'affiche pas du tout, PHP n'appelle absolument pas le fichier .jar au lieu de ne pas simplement intercepter la sortie. La vérité est dit, je ne suis pas tout ce qui a été expérimenté avec PHP / APPACHACHER SERVERS, j'ai donc du mal à trouver des moyens d'essayer de diagnostiquer le problème. En termes de détermination de ce qui se passe ici, je ne sais même pas où commencer.


@Matts je dois demander; Vous avez pris la suggestion d'Ikjoel de changer la ligne BufferedWriter vers Nouveau BufferedWriter (nouveau FileWriter (nouveau fichier ("Out.txt"))); Droite? Parce que sinon Java ne créerait pas le fichier Out.txt. Peut-être devriez-vous également avoir un système.Out.println ("Bonjour!"); Dans votre fichier JAR afin que la sortie soit potentiellement écrite dans le tableau SORTIE VERSON PHP. Le code que vous avez posté doit pour fonctionner - ou du moins en exécutant le fichier JAR - à l'aide d'une erreur non liée au code lui-même. Garde cela à l'esprit! Chemins, autorisations, etc.!


@Alexlynch je n'ai pas le code comme ça. Je mettrai à jour la question originale avec le nouveau code Testjava, bien que ce ne soit pas vraiment différent. Il a un bufferedWriter et une ligne simple.Out.println. En ce qui concerne les autorisations, Testjava.jar dispose d'un accès universel lu / exécutable et Apache est son propriétaire. Je n'ai pas donné le chemin complet parce que je ne pense pas que php appelle la commande 'Java' du tout - j'ai essayé EXEC ('Java -Jar X') , pour voir si je Obtenez le message d'erreur approprié, mais je n'ai rien eu, alors comme je l'ai dit, je suis sûr que ce n'est tout simplement pas appelant Java correctement.


Guess Wild: Java n'est pas dans votre chemin ....


@Wrikken Nope, c'est - le problème était Selinux, il bloquait PHP d'invoquer Java.


5 Réponses :


4
votes

La raison pour laquelle vous ne pouvez pas exécuter LS est à cause des autorisations.

Si vous exécutez le serveur Web comme utilisateur A fort>, vous ne pouvez que ls fort > Seuls ces répertoires qui ont des autorisations qui ont des autorisations pour utilisateur A fortre>. p>

Vous pouvez soit modifier l'autorisation du répertoire, soit vous pouvez modifier l'utilisateur sous lequel le serveur est en cours d'exécution en modifiant le httpd.conf strong> fichier (je suppose que vous utilisez Apache). p>

Si vous modifiez les autorisations du répertoire, assurez-vous de modifier les autorisations des répertoires parent également. P>

Pour changer l'utilisateur du serveur Web, procédez comme suit: p>

Ouvrez le fichier suivant: P>

env CFLAGS=-DBIG_SECURITY_HOLE


3 commentaires

Cela n'a pas bien fonctionné - j'ai suivi vos étapes et j'ai eu une erreur demandant que j'ajouterais un -dbig_security_hole cflag aux variables env. Je ne suis pas trop familier avec CFLAGS en ce qui concerne Apache.


@Matts J'ai édité ma réponse pour expliquer pourquoi vous obtenez cette erreur. Ma suggestion est que vous exécutez l'Apache comme un utilisateur non root au lieu de reconstruire Apache.


J'ai changé l'utilisateur / le groupe pour être l'utilisateur de l'administrateur (juste en dessous de la racine), et cela n'a toujours pas fonctionné.



3
votes

J'ai trouvé le problème - SELINUX bloquait PHP d'accéder à certaines fonctions. Mettre SELINUX EN MODE PERMISSIVE a fixé les problèmes (bien que, je préfère ne pas avoir à quitter SELINUX en mode permissive; je préfère trouver un moyen de permettre certaines fonctions si je peux).


1 commentaires

Essayez d'utiliser la commande audit2allow -a pour analyser le journal et montrer quelles autorisations devraient être utilisées.



-1
votes

Votre problème n'est pas un problème d'exécution, mais la syntaxe de la commande EXEC. Le deuxième argument est toujours renvoyé comme une matrice et contient une seule ligne de la sortie dans chaque index. La valeur de retour de la fonction EXED contiendra la ligne finale des commandes. Pour afficher la sortie que vous pouvez utiliser:

foreach ($ sortie en tant que $ ligne) écho "$ ligne \ n";

voir http://php.net/manual/fr/function.exec.php pour plus de détails. Vous pouvez également obtenir la valeur de sortie de la commande avec un troisième argument.


0 commentaires

3
votes

J'ai une solution: La commande fonctionne à partir de la console, mais pas de PHP via EXEC / SYSTEM / PASSTHRU. Le problème est le chemin d'accès à la commande. Il fonctionne avec le chemin absolu de commander

de sorte que: xxx

devient: xxx

et maintenant, il est Fonctionne de php via EXEC Où la commande binaire vous pouvez voir via où wkhtmltopdf


0 commentaires

2
votes

a déchiré mes cheveux en essayant de déterminer pourquoi PHP Exec fonctionne de la ligne de commande mais pas d'Apache. À la fin, j'ai trouvé les autorisations suivantes:

***getsebool -a | grep httpd*** ----> 
    **httpd_setrlimit --> off
    httpd_ssi_exec --> off
    httpd_sys_script_anon_write --> off**


0 commentaires