Exécuter une commande linux via un script PHP !?

Exécuter une commande linux via un script PHP !? - PHP - Programmation

Marsh Posté le 13-10-2004 à 23:41:50    

Bonsoir !
 
Je cherche un facon simple d'éxecuter une commande que je peux exécuter via le shell par le biais d un script PHP.
 
Je m'explique :
J'ai installé sur mon serveur NetPBM
http://netpbm.sourceforge.net/doc/index.html
qui permet de faire des modifs sur des images.
 
Ces images sont ds 1 sous repertoire (upload/)du serveur web (/var/www/ tout simplement)
 
J'ai tenté un genre :
 
<?php
exec ('jpegtobpm test.jpg > test2.ppm');
?>
 
qui devrait avoir pour effet de copier l image jpg au format NetPBM (avant de lui appliquer des traitements).
 
Hélas, comme vous vous en doutez, ca ne fonctionne pas.
 
Je me demande s'il ne s'agit pas tout simplement d'un probleme de droits.
Le serveur web tourne avec www-data
les fichiers appartiennent a l utilisateur FTP (un compte spécial pour proftpD dans un /etc/proftp_passwd qui correspond a un user dans /etc/passwd).
 
Qui a compris ce que j'ai dit (vu que je me trouve pas tres clair la) et qui pourrait me dire de quel coté chercher ?
 
Merci d'avance !


Message édité par loomy le 13-10-2004 à 23:42:13
Reply

Marsh Posté le 13-10-2004 à 23:41:50   

Reply

Marsh Posté le 14-10-2004 à 11:10:24    

essaye surtout de pas donner le chemin relatif de ton application.
/usr/local/bin/jpegtopbm par exemple (chemin à la con)

Reply

Marsh Posté le 14-10-2004 à 11:54:40    

J'ai testé ainsi :  
 
exec ('/usr/bin/jpegtobpm test.jpg > test2.ppm');
 
résultat identique :-(
 
Rien ne se passe !

Reply

Marsh Posté le 14-10-2004 à 14:42:36    

Alors si j'ai compris :
 
1/ Apache => www-data (jusque là c'est normal)
2/ Les fichiers => FTP (...)
3/ Qui peux lancer NetPBM ?

Reply

Marsh Posté le 14-10-2004 à 14:48:23    

Le probleme venait des droits... Le répertoire de destination ne pouvait etre 'write' par www-data !
 
voici le script :
exec ('/usr/bin/jpegtobpm test.jpg > test2.ppm',$result);
(je vous conseille de vous pencher sur NetPBM, c pas mal du tout)
 
Par contre, je n'arrive pas à avoir une seule info du serveur par le biais de $result :-(
ca me renvoie Array()
 
Je tente bien un  
for ($i=0; $i<sizeof ($result); $i++)
 echo $result[$i].'<br>';
 
mais rien a faire !

Reply

Marsh Posté le 14-10-2004 à 14:52:58    

print_r($result); tu verras si y a des trucs.
mais un echo exec(....) ca donne quoi ?

Reply

Marsh Posté le 14-10-2004 à 16:36:54    

Pardon, j'avais effectivement oublié de signaler la ligne print_r($result); qui me renvoie Array() ds la page HTML (raison pour laquelle j'ai tenté une boucle sur $result)
 
print_r ne renvoie rien, pas plus que echo echo exec ();
 
sizeof ($result) renvoie 0.
 
Je suis donc maintenant preneur d'une solution pour récupérer une validation de l'opération (peut etre un tout simple file_exists() mais je trouve pas ca tres propre).
 


Message édité par loomy le 14-10-2004 à 16:38:10
Reply

Marsh Posté le 14-10-2004 à 17:27:45    

passthru ?

Reply

Marsh Posté le 14-10-2004 à 18:47:47    

L'idée semblait être la bonne, mais ca ne renvoie rien non plus... Même pas un pti Array () :-(
(saleté de linux !!)
 
Merci de tes conseils, si t as d autres idées, je suis preneur  :jap:


Message édité par loomy le 14-10-2004 à 18:48:08
Reply

Marsh Posté le 15-10-2004 à 19:33:17    

Je pense que le problème se situe avec jpegtobpm et son stdout / stderr , peut-être que php n'interprete pas correctement ces flux... d'ou ton problème de retour. J'ai essayé toute les fonctions php et le mieux que j'arrive à avoir c'est un code : 127 sur $int return (erreur ou pas meme résultat) pour celles qui le supporte : Commande php(command,$array,$int return).
http://www.meta.rezoo.org/test.php
 
edit(miam finis):  Le seul mode qui permet de passer directement une commande au shell en php est par défaut désactivé sur la plupart des serveurs web sécurisés :les 2 ligne d'erreurs, le safe mode est on. le script est statique , sers à rien d'essayer d'y passer des variables (pour les petits malins..y'en a toujours..).
 J'ai fait ce script linéairement, en incluant ta boucle for meme si connaissant la nature du stdout de la librairie, ça ne servirais à rien, juste pour etre sur.
 
 
Nous avons rencontré un problème similaire lors de la mise en place d'une plate forme de controle des serveurs de jeux. Je ne vais pas entrer dans le détail, mais nous utilisions perl pour le passage des commandes aux serveurs "esclaves" via la commande system(),des  
wrappers cgi (écrit en shell)utilisant ssh pour la communication serveurs esclaves<->master, mysql pour le stockage des variables et screen ou nohup pour envoyer les processus dans le background sans en perdre le controle.
 
l'interet,l'avantage..? System() en perl retourne un code de 0 dans $? s'il n'y a pas eu d'erreur pour le shell et tout autre chiffre(c pas tjrs le même :heink: ) pour signaler une erreur. Pour accompagner le dévelopement il fut trés facile de débuger en ajoutant des echo dans les wrappers...
 
Je suis trop nioub pour trouver une solution en php, si je me réfère aux pages de man, php devrait retourner stdout avec passthru Or c'est pas le cas. la faute va a jpegtopnm, je dois partir manger mais une idée serait d'utiliser nohup ou screen et récupérer stdout via les fichier .out qu'ils créent,si tu tiens vraiment à voir la série de "jpegtopnm: WRITING PPM FILE" (stdout de la lib..) qui n'a que trés peu d'intéret finalement vu le message que ça transporte... Ou basculer ton serveur en mode non-safe et tester (avec les risque que ça comporte). Ou encore faire un peu de perl  :sol:  


Message édité par efflamm le 15-10-2004 à 20:51:36
Reply

Marsh Posté le 15-10-2004 à 19:33:17   

Reply

Marsh Posté le 16-10-2004 à 09:17:10    

Tout d'abord, merci Efflamm  :jap: du temps que tu as pris pour me répondre (et pour tester des solutions).
 
NetPBM ne renvoie rien de plus que jpegtopnm: WRITING PPM FILE si l'opération a réussi en effet, mais si une erreur survient, j'ai pas de moyen de contrôle la dessus  :sweat: .  
Pour le moment, le seul contrôle que je peux effectuer via PHP, c'est :
if( !file_exists ( $nom_de_fic ) ) afin de savoir si le fichier a bien été créé par NetPBM.
 
Je vais tester nohup ou screen, juste pour voir comment ca fonctionne (je suis pas encore un expert sous linux :pt1cable: )
 
J aimerais bien savoir par quel biais tu récupères ton 127 quand meme :)


Message édité par loomy le 16-10-2004 à 18:33:02
Reply

Marsh Posté le 16-10-2004 à 12:07:31    

if( !fils_exists ( $nom_de_fic ) ) c'est finalement bien plus propre qu'utiliser nohup ou screen :D , donc il se pourrait que tu es là  une trés bonne solution !
 
J aimerais bien savoir par quel biais tu récupères ton 127 quand meme :)
A vrai dire, je sais juste par quel variable je l'ai : $int return dans Commande php(command,$array,$int_return) en 3ième params.. Mais un des hic c'est que ça ne veut pas dire grand chose! la variable s'initialise bien lors de l'execution de la commande php, puisque $int_return n'a pas de valeur avant.
 
Pourtant d'après le man de php, c'est censé être "le code de statut de réponse UNIX", mais il ne varie pas en fonction des erreurs. La réponse est ailleurs..  :pt1cable:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed