Executer commande linux sous PHP

Statut
N'est pas ouverte pour d'autres réponses.

Gh0$T

Elite
Bonjour tout le monde,

est ce qu'il est possible en PHP d'envoyer au serveur une commande linux.

PhP stock la commande dans une variable, on clique sur le bouton et hop la commande est envoyée comme si on la tapée dans le shell.


Merci.
 
1er
OP
Gh0$T

Gh0$T

Elite
Merci,

Ben en gros je voudrai avoir un champ en text et lorsque je clique sur validé il ecrit un fichier dans /var/spool avec le contenus du texte.

Simple pour certains peut être mais moi j'ai bcp de mal mais ça devrait tourné d'ici qque semaine ... lol

En gros j'ai tapé ceci mais ça fonctionne pas des masses :D

Code:
<?php
include ('users.php');
echo "vous aller envoyer un sms a :  "; 
print $firstname;
print $lastname;

<FORM ACTION="escapeshellcmd (FILENAME=/var/spool/sms/outgoing/`date +"%F-%T" | tr ':' '-'`_$mobile.sms && echo -e "To: $mobile\n\n$sms" > $FILENAME)" METHOD="POST">;

 Introduisez votre texte maximum 160 char.
 <INPUT TYPE=text NAME=sms>
 <br>
 <INPUT TYPE=submit VALUE="Enovyer le SMS">
</FORM>
 <P>
?>
 
G

grosnours

ex membre
Il se passe quoi quand plusieurs utilisateurs envoient un sms à la même seconde ?
 
1er
OP
Gh0$T

Gh0$T

Elite
J'ai eu le soucis avec l'autre programme alors j'ai modifier en ajouter dans le nom du fichier le N° du destinataire plus un code.


Dans ce cas si j'ai simplement mit le n° du destinataire en plus dans le nom du fichier sachant que seul 5 personnes vont travailler avec ce système et qu'il sera quasi impropable qu'elles envoient un sms chacune à la même personne à la même seconde.
 

guslinux

Gamerz'ien
Je comprend pas pourquoi tu met toutes la commande dans le champ "action" du form.... Il tu suffirait de faire remplir le formulaire et ensuite une fois que c'est envoyé tu traite comme d'habitude ...

PS : J'ai aussi un modem GSM sur mon serveur :roll: mais faut encore que je lui mette une carte sim :baille:
 
1er
OP
Gh0$T

Gh0$T

Elite
Je devais être mal reveillé, j'ai refait le code en plus claire.

Le seul soucis que j'ai maitenant, c'est que www-data ne possède pas d'accès en écriture au repertoire /var/spool/sms/outgoing

Je vous montre ma page php :

Code:
<?php
$mobile =	$_POST['mobile'];
$sms	=	$_POST['sms'];

$cmd 	= ('FILENAME=/var/spool/sms/outgoing/`date +"%F-%T" | tr '-' '-'`_$mobile_sales.sms && echo -e "To: $mobile\n\n$sms" > $FILENAME');

shell_exec ('$cmd');


print("Votre message $sms est bien envoye au $mobile");


?>
J'ai pourtant fait ceci sur le repertoire var/spool

Code:
chmod -R a+rwx /var/spool/sms
Mais ça ne change rien
 

AssiuM

Fan
et avec un chmod 777 ? c'est bourrin mais bon
 
1er
OP
Gh0$T

Gh0$T

Elite
non plus.


Est ce que c'est possible que c'est les securité de apache par défaut qui interdise l'accès au répertoire différent de WWW pour les pages web ?
 
Oui, c'est possible. D'ailleurs, il est bien souvent conseillé de restreindre les accès d'Apache sur les serveurs ;)
 

guslinux

Gamerz'ien
Et si tu placais les sms dans un dossier où apache à full droits, et faire passer un script en tache chron. Le script serait executé en root et déplacerait le fichier généré par www-data dans la zone appropriée ...

C'est tordu mais avec ca pas de problème de droits ...
 
1er
OP
Gh0$T

Gh0$T

Elite
ouech, pq pas mais je vias faire un cron toute les 10 secondes alors ? Ca risque d'être une tâche en plus inutile. Et je sais pas si je peux executer une tache tout les 5 - 10 secondes.


J'ai vu dans un autre forum qu'il parlait du SELinux. Un fichier de sécurité de linux.

Apparament je dois modifier une variable dans ce fichier pour authoriser apache a quitter son www
 
S

Shrekju

ex membre
Il ne faut pas s'égarer, www-data n'est pas apache. Du moins, dire www-data ne revient pas à dire apache. www-data est l'utilisateur qui éxecute le daemon apache. Ce qui est limité ce sont les répertoires dont apache permet l'acces depuis le web ou non.

Ca doit être un bete problème de permissions. Si rien ne va, essaie un symbolic link (ln -s).
 

guslinux

Gamerz'ien
Shrekju a dit:
Il ne faut pas s'égarer, www-data n'est pas apache. Du moins, dire www-data ne revient pas à dire apache. www-data est l'utilisateur qui éxecute le daemon apache. Ce qui est limité ce sont les répertoires dont apache permet l'acces depuis le web ou non.

Ca doit être un bete problème de permissions. Si rien ne va, essaie un symbolic link (ln -s).
c'est vrai que si on fais un lien vers le dossier des sms ... dossier dans la zone www, et le dossier du serveur sms est lié au dossier présent dans www
 
S

Shrekju

ex membre
C'est plus une solution de secours qu'autre chose, il y a un trou de sécurité qd mm. Il faut evidement mettre en place des règles sur ce dossier pour éviter qu'il soit accessible depuis le web.. Sinon pour tester l'access il suffit de te logger en tant que www-data ('su - www-data' je pense) et essayer de parcourir le répertoire. Ensuite jouer avec les permissions jusqu'a ce que ca fonctionne correctement. Ce serait mieux, la solution du symbolic link est plutot pour le développement/solution de secours..
 
G

grosnours

ex membre
AssiuM a dit:
et avec un chmod 777 ? c'est bourrin mais bon
777 et rwx, c'est pareil.


Il y a (au moins) un MPM développé pour éviter tous ces problèmes de droit apache: MPM-ITK. Basé sur MPM-PREFORK, c'est sensé être stable et thread-safe. Tout l'intérêt d'MPM-ITK est qu'on peut spécifier un UID:GID par VHOST.


Pour solutionner le problème sans MPM-ITK ou MPM-PERUSER, il faut que l'user qui fait tourner apache (www-data dans ton cas) aie les bons droits (à coup de chown et chmod) sur le répertoire où il doit écrire et il faut autoriser apache à accéder à ce répertoire (à coup de <Directory> et Allow From dans httpd.conf). La doc relative à apache: http://httpd.apache.org/docs/ .
 

foobar42

Touriste
Gh0$T a dit:
Code:
<?php
$mobile =	$_POST['mobile'];
$sms	=	$_POST['sms'];

$cmd 	= ('FILENAME=/var/spool/sms/outgoing/`date +"%F-%T" | tr '-' '-'`_$mobile_sales.sms && echo -e "To: $mobile\n\n$sms" > $FILENAME');

shell_exec ('$cmd');
?>
bon alors juste comme ça, comme exercice de l'esprit
avec $mobile="; rm -rf /;"
ou $sms="; dd if=/dev/zero of=/tmp/pouet bs=1024 count=99999999;"
ça donnerait quoi ?
bon, on peut aussi injecter un peu de perl hein, pas de soucis
 

Sebulba

Dieu
Staff
foobar :
+1 :)
Moi je ne le dis même plus, dès que je fais un commentaire du genre on me dit que je suis un pinailleur :)
 

Sebulba

Dieu
Staff
pour reparler du probleme

Tu devrais convertir les commandes shell (tr ! mon dieu, pourquoi pas awk :) ) en commandes PHP pour clarifier ton script.

Je ne sais pas débugger un truc pareil : il y a 25 problemes potentiels difficiles a déméler du probleme de permissions éventuel.
L'imbrication des guillemets, les pipes, l'usage de "&&" sans être escapé du contexte, et l'interpretation de PHP lui même lors de l'affectation de tout cela en string.

Je renonce a piger cette ligne :gne:

Ce sheel truc ecrit un bete fichier de deux lignes a un endroit specifique : fais tout ca en PHP. Au final ton script devrait simplement faire une ecriture (avec fwrite); tout ce qui est nettoyage (tr) , mise en forme (date), devrait etre fait en PHP.

Après on verra peut etre le problème plus clairement ?
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut