commande exec() & droits utiisateurs

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : commande exec() & droits utiisateurs

par Ripat » 20 févr. 2006, 16:52

... appris plein de chose avec tous tes conseils.
Moi aussi. Assez étonné d'ailleurs que la commande exec(), system() ou passthru() ne récupère pas le stderr du shell. J'ai peut-être raté quelque-chose!

Je vois que tu t'es inscrit. Bienvenue au club!

par Romeo » 20 févr. 2006, 16:18

Vraiment formidable.

Tout fonctionne.

J'ai bien suivi et appris plein de chose avec tous tes conseils.

Merci encore

Romeo

par Ripat » 20 févr. 2006, 16:05

Code : Tout sélectionner

exec(MA COMMANDE 2>&1 PARAMETRES, $out, $status);
Uniquement si tu souhaites voir ce que le bash te renvoie comme erreur. Normalement, exec() assignera à $out, la sortie standard (stdout). Si, par exemple tu veux lister tes fichiers avec la commande ls, si tu fais:
exec('ls', $out);
Le résultat (stdout) sera stocké dans le tableau $out. Mais si une erreur se produit, il n'y aura aucune stdout mais bien une sortie vers stderr du shell Linux. Or, celui-ci n'est pas renvoyé à PHP pour une raison qui m'échappe.

En ajoutant à la commande à exécuter l'instruction 2>&1 on redirige le stderr vers le stdout ce qui rend le message d'erreur du shell disponible dans PHP (dans le $out de mon exemple). Mais plus la sortie standard! Tu me suis toujours? C'est pourquoi ce n'est à utiliser que pour débuger.
As tu une solution pour que l'éxécution du script php se termine tout en laissant l'exec(...) continuer ?
Oui:
exec("mysqldump -u LOGIN -pMDP maBDD> /sauvegarde/maBDD.sql &");
L'ajout de & devrait exécuter le dump en arrière-plan et rendre la main à l'exec() de PHP.

par Romeo » 20 févr. 2006, 14:37

OK, impecable

Tout est rentré dans l'ordre.

Merci pour ta patience Ripat.

Maintenant je m'aperçoit que le temps d'éxécution est un peu long du fait de la taille de la BDD.

As tu une solution pour que l'éxécution du script php se termine tout en laissant l'exec(...) continuer ?

par Romeo » 20 févr. 2006, 14:28

Le dossier "sauvegarde" est bien créé.

C'est le fichier de sortie dans ce dernier cas qu'il ne veut pas créer.
Ce qui me pose quand même un nouveau probleme car le non du fichier de sortie reprendra la date du jour ex : sauvegarde_20-02-2006.sql

Ok bon ça avance.

Si j'ai bien compris, je dois utiliser cette syntaxe pour l'instruction exec()

Code : Tout sélectionner

exec(MA COMMANDE 2>&1 PARAMETRES, $out, $status);

par Ripat » 20 févr. 2006, 14:18

Je pensais qu'il créerait éventuellement le fichier de sortie. Apparament non.

si je crée le fichier mabase.sql avec les permissions en écriture c'est bon
=> /sauvegarde/mabase.sql
Il créera bien le fichier de sortie mais pas le répertoire si celui-ci n'existe pas.

Encore une illustration de l'importance de ne pas travailler à l'aveugle et de bien lire les messages d'erreur.

J'ai appris quelque-chose: exec() de php ne renvoie pas, de manière standard, le stderr de linux. Dommage.

par Romeo » 20 févr. 2006, 14:08

Je pensais qu'il créérait éventuellement le fichier de sortie. Apparament non.

si je crée le fichier mabase.sql avec les permissions en écriture c'est bon
=> /sauvegarde/mabase.sql

par Invité » 20 févr. 2006, 14:01

Ah ca répond.
Voila ce que ca renvoi.

Code : Tout sélectionner

Array ( [0] => sh: /sauvegarde/mabase.sql: No such file or directory )

par Ripat » 20 févr. 2006, 13:26

Apparemment, la fonction exec() ne renvoie pas les erreurs éventuelles de l'exécution d'une commande. Il va falloir finasser avec linux et rediriger stderr vers stdout. Pas très beau mais nécessité fait loi!
exec("mysqldump  2>&1 -u LOGIN -pMDP maBDD> /sauvegarde/maBDD.sql", $out, $statut); 
echo '<pre>';
print_r($out);
echo '</pre>';

par Invité » 20 févr. 2006, 12:46

Tres etrange, en fait il renvoi rien.

Tout depend ou je place la ligne de code.

Désolé des réponses un peu rapide.

Donc pour résumer,
exec("mysqldump -u LOGIN -pMDP maBDD> /sauvegarde/maBDD.sql", $out, $statut); 
echo $statut;
=>> ne renvoi RIEN

par Romeo » 20 févr. 2006, 12:40

Ca renvoie 1

par Ripat » 20 févr. 2006, 12:25

Que te donne :
exec("mysqldump -u LOGIN -pMDP maBDD> /sauvegarde/maBDD.sql", $out, $statut);
echo $statut;

par Romeo » 20 févr. 2006, 12:22

On dirait qu'il ignore totalement cette ligne commande "exec(....)"

<?php

ini_set(display_errors, 1);
error_reporting(E_ALL);
exec("mysqldump -u LOGIN -pMDP maBDD> /sauvegarde/maBDD.sql");

echo "OK";
?>

Le message OK s'affiche, mais toujours pas de dump :cry:

par Romeo » 20 févr. 2006, 12:08

Par contre je viens de voir ça :

Code : Tout sélectionner

display_errors = Off
Comment puis modifier cette clause pour le fichier concerné ??

par Romeo » 20 févr. 2006, 12:05

Voici mon code

Code : Tout sélectionner

<? error_reporting(E_ALL); exec("mysqldump -u LOGIN -pMDP maBDD> /sauvegarde/maBDD.sql"); ?>
Aucune erreur en retour, et la sauvegarde n'a pas été éfféctuée.