Page 1 sur 1

shell_exec

Posté : 26 mars 2015, 14:44
par salade
Bonjour,

J'aimerais exécuter une commande shell via une page php.
Je "developpe" une interface pour générer des timelapses, le serveur apache/php tourne sur un raspberry pi.
Via un formulaire, je récupère les paramètres du timelapse en tant que variables puis je passe la commande.
Le formulaire brut de pomme: http://www.moreau-fr.net/tmp/timelapse/index.php
Je concatène ensuite la ligne de commande avec les variables, c'est fonctionnel.
Je stocke ma ligne de commande dans une variable "cmd"

Code : Tout sélectionner

<? $cmd = "sudo raspivid -t $t -tl $tl -o $o%0$d.jpg -w $w -h $h -q $q -ev $ev -co $co -br $br -sa $sa -ex $ex -awb $awb" ;?>
Quand j'affiche le contenu, la syntaxe est correcte :

Code : Tout sélectionner

sudo raspivid -t 10000 -tl 1000 -o IMG_%04d.jpg -w 2592 -h 1944 -q 100 -ev 0 -co 0 -br 0 -sa 0 -ex auto -awb off
Le hic, c'est quand j'éssaie de passer la commande concaténée, soit $cmd via shell_exec.
Je me doute qu'il y a un problème de syntaxe.

Code : Tout sélectionner

<? $output = shell_exec('echo "$cmd"'); echo "<pre>$output</pre>"; ?>
En passant la commande non concaténée, donc sans utiliser $cmd, je n'arrive à rien non plus.
J'ai éssayé les syntaxes suivantes :

Code : Tout sélectionner

<? //$output = shell_exec('sudo raspivid -t "'.$t.'" -tl "'.$tl.'" -o "'.$o.'" %0 "'.$d.'".jpg -w "'.$w.'" -h "'.$h.'"'); //$output = shell_exec('sudo raspivid -t '.$t.' -tl '.$tl.' -o '.$o.' %0 '.$d.'.jpg -w '.$w.' -h '.$h.''); //$output = shell_exec('sudo raspivid -t "$t" -tl "$tl" -o "$o" %0 "$d".jpg -w "$w" -h "$h"'); //$output = shell_exec('sudo raspivid -t '.escapeshellarg($t).' -tl '.escapeshellarg($tl).' -o '.escapeshellarg($o).' %0 '.escapeshellarg($d).'.jpg -w '.escapeshellarg($w).' -h '.escapeshellarg($h).''); echo "<pre>$output</pre>"; ?>
En revanche, si je fais un :

Code : Tout sélectionner

<? $ls = shell_exec('ls -la'); echo "<pre>$ls</pre>"; ?>
Cela fonctionne parfaitement, idem si je lance la commande via un script :

Code : Tout sélectionner

<?php //$output = shell_exec('sudo /home/pi/timelapse.sh'); //echo "<pre>$output</pre>"; ?>
Voilà, je ne maitrise pas bien la syntaxe php, si quelqu'un "voit" le problème, je suis preneur.

Cordialement,

Laurent

Re: shell_exec

Posté : 27 mars 2015, 00:06
par moogli
salut,

ceci devrait fonctionner, si la concaténation est correcte.
<?php
$cmd = 'sudo raspivid -t '.$t.' -tl '.$tl.' -o $o%0'.$d.'.jpg -w '.$w.' -h '.$h.' -q '.$q.' -ev '.$ev.' -co '.$co.' -br '.$br.' -sa '.$sa.' -ex '.$ex.' -awb '.$awb;
$output = shell_exec($cmd);
echo '<pre>',$output,'</pre>'; // les virgules ne sont pas une erreur. 
?>
afin d'éviter les problèmes de compatibilité avec la conf serveur il est préférable d'utiliser les <?php plutôt que <?
Afin d'avoir une syntaxe lisible je te conseil aussi d'utiliser la concaténation plutôt que de mettre les variables dans la chaîne de caractère (+ le gain de perf vu qu'il n'y a pas d'analyse de la chaîne pour y mettre les variables).


@+

Re: shell_exec

Posté : 27 mars 2015, 11:43
par salade
Bonjour,

Merci beaucoup pour la contribution.
Cela ne fonctionne toujours pas.
Commentaire : pour les variables, on les encadre donc par :

Code : Tout sélectionner

'.$var.'
Question : tu commences la déclaration de la variable $cmd avec une quote mais elle n'est pas fermée en fin de ligne, idem pour la dernière variable $awb.

Code : Tout sélectionner

$cmd = 'sudo raspivid ... '.$awb;
C'est normal ou c'est un oubli ?
J'ai essayé ça sans succès :

Code : Tout sélectionner

$cmd = 'sudo raspivid ... '.$awb.'';
Je vais regarder du côté des logs apache et php.

Merci beaucoup en attendant.

Re: shell_exec

Posté : 27 mars 2015, 13:42
par salade
Mea culpa, cela fonctionne parfaitement avec cette ligne de commande, merci.
En fait je passais des paramètres destiné à la commande raspistill en utilisant raspivid !!

Code : Tout sélectionner

$cmd = 'sudo raspistill -t '.$t.' -o '.$o.'%0'.$d.'.jpg -w '.$w.' -h '.$h.' -tl '.$tl.' -q '.$q.' -ev '.$ev.' -co '.$co.' -br '.$br.' -sa '.$sa.' -ex '.$ex.' -awb '.$awb;
$output = shell_exec($cmd);
J'ai fais mon boulet ;-)
En revanche, pourauoi la page php s'affiche après l'execution du script !

Merci encore