Exécution de script shell via PHP

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 : Exécution de script shell via PHP

Re: Exécution de script shell via PHP

par moogli » 18 mars 2013, 21:56

as tu testé le script sh tout seul en console ?


pourquoi utiliser un script sh pour cela ? php peu le faire, surtout si c'est sur ta machine il suffit de mettre les bon droit sur les dossiers.


@+

Re: Exécution de script shell via PHP

par Sayko » 14 mars 2013, 20:40

Bon ça fonctionne.

En fait il fallait mettre des double quotes dans le bash aussi
$var_fichier2 = $_FILES['addmusic_path']['name'];
$var_titre2 = $_POST['addmusic_titre'];
$var_artist2 = $_POST['addmusic_artiste'];
$var_album2 = $_POST['addmusic_album'];
$var_genre2 = $_POST['genre'];
$var_date2 = $_POST['addmusic_annee'];
$var_number2 = $_POST['addmusic_number'];
						
$var_fichier = "\"$var_fichier2\"";
$var_titre = "\"$var_titre2\"";
$var_artist = "\"$var_artist2\"";
$var_album = "\"$var_album2\"";
$var_genre = "\"$var_genre2\"";
$var_date = "\"$var_date2\"";
$var_number = "\"$var_number2\"";
				
//exec(escapeshellcmd("sh scripts/aj_musique.sh $var_fichier $var_titre $var_artist $var_album $var_genre $var_date $var_number"));
//shell_exec ('sh scripts/aj_musique.sh '.$var_fichier.' '.$var_titre.' '.$var_artist.' '.$var_album.' '.$var_genre.' '.$var_date.' '.$var_number);
exec(escapeshellcmd("sh scripts/aj_musique.sh $var_fichier  $var_titre  $var_artist  $var_album  $var_genre  $var_date  $var_number"));
#!/bin/bash

var_fichier=$1
var_titre=$2
var_artist=$3
var_album=$4
var_genre=$5
var_date=$6
var_number=$7

chemin_musique=../upload/"$var_fichier"
extension=${chemin_musique##*.}

if [ ! -d /home/xbmc/musique/"$var_artist"/"$var_album" ]
then mkdir -p /home/xbmc/musique/"$var_artist"/"$var_album"
fi

touch /home/xbmc/musique/"$var_artist"/"$var_album"/"$var_titre".nfo

echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>
<music>
<title>"$var_titre"</title>
<artist>"$var_artist"</artist>
<album>"$var_album"</album>
<genre>"$var_genre"</genre>
<year>"$var_date"</year>
<number>"$var_number"</number>
</music>" > /home/xbmc/musique/"$var_artist"/"$var_album"/"$var_titre".nfo

cp "$chemin_musique" /home/xbmc/musique/"$var_artist"/"$var_album"/"$var_titre"."$extension"
Du coup maintenant c'est la copie à la fin qui ne fonctionne pas, rien ne se produit... Je suis maudit décidément. Ne serait-ce pas un problème de droits?
Pourtant le www-data est owner de la source de la copie, de sa destination et du dossier scripts.

Re: Exécution de script shell via PHP

par Sayko » 14 mars 2013, 19:18

Merci pour ta réponse mais malheureusement cela ne fonctionne toujours pas.

En effet le script a un comportement... pour le moins particulier :/

Il crée un dossier test au bon endroit

Puis à la racine de mon projet php il me crée "var/www/monprojetphp/retest/autre/autre.txt"

J'avoue ne pas trop comprendre là Oo

Re: Exécution de script shell via PHP

par yann18 » 14 mars 2013, 17:46

Merci beaucoup de l'intérêt que tu porte à mon problème :D

Alors j'ai testé ta solution sur un script shell tout simple et ça ne semble plus fonctionner dès qu'il rencontre un espace.


		<?php
		$toto = 'test retest';
		$tata = 'autre';
		
		$tutu = $toto;
		$titi = $tata;
		
		// Nous autorisons un nombre arbitraire d'arguments de façon intentionnel ici.
		//exec(escapeshellcmd('sh scripts/test.sh '.$tutu.' '.$titi));
		shell_exec("sh scripts/test.sh \"$tutu\"  \"$titi\" ");
		?>

BASH:
#!/bin/bash

tutu=$1
titi=$2

mkdir -p /home/xbmc/$tutu/$titi
touch /home/xbmc/$tutu/$titi/$titi.txt
Du coup en sortie j'obtiens une arbo comme présente:
/home/xbmc/test/

au lieu de:
/home/xbmc/test retest/autre/
d'accord , c'est le caractère d'échappement (\) qui pose problème.il fut échapper autrement:
		<?php
		$toto = "test retest";
		$tata = "autre"; //affichera -> "autre"
		
		$tutu = "\"$toto\"";
		$titi = "\"$tata\"";
		
		// Nous autorisons un nombre arbitraire d'arguments de façon intentionnel ici.
		//exec(escapeshellcmd('sh scripts/test.sh '.$tutu.' '.$titi));
		shell_exec("sh scripts/test.sh  $tutu   $titi ");
		?>

BASH:

Code : Tout sélectionner

#!/bin/bash tutu=$1 titi=$2 mkdir -p /home/xbmc/$tutu/$titi touch /home/xbmc/$tutu/$titi/$titi.txt
l’objectif est de pouvoir exécuter le script (où chaque argument est entouré des guillements doubles)
sh sh scripts/test.sh "toto titi" "totionumero 2"

Re: Exécution de script shell via PHP

par Sayko » 14 mars 2013, 16:44

Merci beaucoup de l'intérêt que tu porte à mon problème :D

Alors j'ai testé ta solution sur un script shell tout simple et ça ne semble plus fonctionner dès qu'il rencontre un espace.

PHP:
		<?php
		$toto = 'test retest';
		$tata = 'autre';
		
		$tutu = $toto;
		$titi = $tata;
		
		// Nous autorisons un nombre arbitraire d'arguments de façon intentionnel ici.
		//exec(escapeshellcmd('sh scripts/test.sh '.$tutu.' '.$titi));
		shell_exec("sh scripts/test.sh \"$tutu\"  \"$titi\" ");
		?>

BASH:
#!/bin/bash

tutu=$1
titi=$2

mkdir -p /home/xbmc/$tutu/$titi
touch /home/xbmc/$tutu/$titi/$titi.txt
Du coup en sortie j'obtiens une arbo comme présente:
/home/xbmc/test/

au lieu de:
/home/xbmc/test retest/autre/

Re: Exécution de script shell via PHP

par yann18 » 14 mars 2013, 16:29

je voulais dire en passant que je ne comprendre pas ton choix quant à l'usage d'un script shell. Il est clair qu'en php on peut facilement construire son arbre XML, copier des fichiers grâce à la fonction copy(), créer un répertoire grâce mkdir.

Re: Exécution de script shell via PHP

par yann18 » 14 mars 2013, 16:21

concernant les espaces il faut entourer chacun des arguments du script shell par des guillemets doubles("). Pour ce qui est des caractères accentués qui n’apparaissent pas c'est dû à la fonction htmlspecialchars , fonction d'ailleurs qui est totalement inutile pour encoder les données entrées par l'utilisateur.cette dernière fonction intervient plutôt dans l'affichage des données.du coup htmlspecialchar est à virer.
Bon j'ai compris mon soucis... seulement je ne sais pas comment le résoudre :(

En fait, à chaque fois qu'il y a un espace, il passe à la variable suivante. Et autre soucis, il fait sauter les accents dans mon fichier xml
$var_fichier = $_FILES['addmusic_path']['name']);
$var_titre = $_POST['addmusic_titre'];
$var_artist = $_POST['addmusic_artiste'];
$var_album = $_POST['addmusic_album'];
$var_genre = $_POST['genre'];
$var_date=  $_POST['addmusic_annee'];
$var_number= $_POST['addmusic_number'];
					
//exec(escapeshellcmd("sh scripts/aj_musique.sh $var_fichier $var_titre $var_artist $var_album $var_genre $var_date $var_number"));

shell_exec("sh scripts/aj_musique.sh \"$var_fichier\"  \"$var_titre\"  \"$var_artist\"  \"$var_album\"  \"$var_genre\"  \"$var_date\"  \"$var_number\" ");

Re: Exécution de script shell via PHP

par Sayko » 14 mars 2013, 15:15

Bon j'ai compris mon soucis... seulement je ne sais pas comment le résoudre :(

En fait, à chaque fois qu'il y a un espace, il passe à la variable suivante. Et autre soucis, il fait sauter les accents dans mon fichier xml

PHP:
$var_fichier = (htmlspecialchars($_FILES['addmusic_path']['name']));
$var_titre = (htmlspecialchars($_POST['addmusic_titre']));
$var_artist = (htmlspecialchars($_POST['addmusic_artiste']));
$var_album = (htmlspecialchars($_POST['addmusic_album']));
$var_genre = (htmlspecialchars($_POST['genre']));
$var_date= (htmlspecialchars($_POST['addmusic_annee']));
$var_number= (htmlspecialchars($_POST['addmusic_number']));
					
//exec(escapeshellcmd("sh scripts/aj_musique.sh $var_fichier $var_titre $var_artist $var_album $var_genre $var_date $var_number"));
shell_exec ('sh scripts/aj_musique.sh '.$var_fichier.' '.$var_titre.' '.$var_artist.' '.$var_album.' '.$var_genre.' '.$var_date.' '.$var_number);
Le bash:

Code : Tout sélectionner

#!/bin/bash var_fichier=$1 var_titre=$2 var_artist=$3 var_album=$4 var_genre=$5 var_date=$6 var_number=$7 chemin_musique=../upload/$var_fichier extension=${chemin_musique##*.} if [ ! -d /home/xbmc/musique/$var_artist/$var_album ] then mkdir -p /home/xbmc/musique/$var_artist/$var_album fi touch /home/xbmc/musique/$var_artist/$var_album/$var_titre.nfo echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?> <music> <title>"$var_titre"</title> <artist>"$var_artist"</artist> <album>"$var_album"</album> <genre>"$var_genre"</genre> <year>"$var_date"</year> <number>"$var_number"</number> </music>" > /home/xbmc/musique/$var_artist/$var_album/$var_titre.nfo cp $chemin_musique /home/xbmc/musique/$var_artist/$var_album/$var_titre.$extension
Et normalement je veux obtenir un truc dans le genre:

Sachant que le nom de la musique est: "02 - Psychotic euphoric.mp3".
Et que mes valeurs de variables sont:
$var_fichier = 02 - Psychotic euphoric.mp3
$var_titre = Psychotic Euphoric
$var_artist = Silent Desent
$var_album = Mind Games
$var_genre = Métal
$var_date = 2012
$var_number = 2 //Deuxième chanson de l'album
Le XML j'aimerais avoir:
|
v
<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>
<music>
<title>Psychotic euphoric</title>
<artist>Silent Descent</artist>
<album>Minds Games</album>
<genre>Métal</genre>
<year>2012</year>
<number>2</number>
</music>
Mais malheureusement, j'obtiens un truc comme ça:
<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?>
<music>
<title>-</title>
<artist>Psychotic</artist>
<album>euphoric.mp3</album>
<genre>Psychotic</genre>
<year>Euphoric</year>
<number>Silent</number>
</music>
Et là... je vois vraiment pas comment résoudre ce soucis. :/

Re: Exécution de script shell via PHP

par Sayko » 14 mars 2013, 13:51

Le script seul sans php fonctionne, il a été testé par la personne qui les a réalisés.

Voila ce que ça me donne au niveau de l'arbo et du fichier:
arbo.png
fichier xml.png

Re: Exécution de script shell via PHP

par yann18 » 14 mars 2013, 13:28

Ben je comprends pas car là ma syntaxe fonctionnait, bon j'essaye la tienne :)
excuse moi j'ai pas dû lire que ta syntaxe fonctionnait.

Essaies de lancer ton script shell seul (sans php) pour pouvoir mieux localiser le problème.

Re: Exécution de script shell via PHP

par Sayko » 14 mars 2013, 12:45

Ben je comprends pas car là ma syntaxe fonctionnait, bon j'essaye la tienne :)

EDIT: Bon j'ai essayé avec ta syntaxe et ça fonctionne toujours pas, enfin à moitié, il m'as pris des valeurs bizarres :s
$var_fichier = $_FILES['addmusic_path']['name'];
$var_titre = $_POST['addmusic_titre'];
$var_artist = $_POST['addmusic_artiste'];
$var_album = $_POST['addmusic_album'];
$var_genre = $_POST['genre'];
$var_date=$_POST['addmusic_annee'];
$var_number= $_POST['addmusic_number'];
						
exec(escapeshellcmd("sh scripts/aj_musique.sh $var_fichier $var_titre $var_artist $var_album $var_genre $var_date $var_number"));

Code : Tout sélectionner

#!/bin/bash var_fichier=$1 chemin_musique=../upload/$var_fichier extension=${chemin_musique##*.} var_titre=$2 var_artist=$3 var_album=$4 var_genre=$5 var_date=$6 var_number=$7 if [ ! -d /home/xbmc/musique/$var_artist/$var_album ] then mkdir -p /home/xbmc/musique/$var_artist/$var_album fi touch /home/xbmc/musique/$var_artist/$var_album/$var_titre.nfo echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?> <music> <title>"$var_titre"</title> <artist>"$var_artist"</artist> <album>"$var_album"</album> <genre>"$var_genre"</genre> <year>"$var_date"</year> <number>"$var_number"</number> </music>" > /home/xbmc/musique/$var_artist/$var_album/$var_titre.nfo cp $chemin_musique /home/xbmc/musique/$var_artist/$var_album/$var_titre.$extension

Re: Exécution de script shell via PHP

par yann18 » 14 mars 2013, 12:42

Merci pour ta réponse :)

Bon j'arrive a récupérer les valeurs à présent avec un script très basique, mais je n'arrive pas à faire fonctionner mon script définitif.

php:
<?php
$toto = 'test';
$tata = 'prout';

$tutu = $toto;
$titi = $tata;

exec(escapeshellcmd('scripts/test.sh '.$tutu.' '.$titi));
?>
bash:

Code : Tout sélectionner

#!/bin/bash tutu=$1 titi=$2 mkdir -p /home/xbmc/$tutu/$titi
Et voila ce que je cherche à faire fonctionner:

php:


bash:
en revanche, pour exécuter le script shell depuis php voilà comment s'y prendre:
<?php
$toto = 'test';
$tata = 'prout';

$tutu = $toto;
$titi = $tata;

exec(escapeshellcmd("sh scripts/test.sh $tutu  $titi"));
?>

Re: Exécution de script shell via PHP

par yann18 » 14 mars 2013, 12:34

pour exécuter ton le script ci-dessous:

Code : Tout sélectionner

#!/bin/bash tutu=$1 titi=$2 mkdir -p /home/xbmc/$tutu/$titi

Code : Tout sélectionner

en ligne de commande: sh nomDuScript.sh toto hello

Re: Exécution de script shell via PHP

par Sayko » 14 mars 2013, 12:25

Merci pour ta réponse :)

Bon j'arrive a récupérer les valeurs, à présent avec un script très basique, mais je n'arrive pas à faire fonctionner mon script définitif.

php:
<?php
$toto = 'test';
$tata = 'prout';

$tutu = $toto;
$titi = $tata;

exec(escapeshellcmd('scripts/test.sh '.$tutu.' '.$titi));
?>
bash:

Code : Tout sélectionner

#!/bin/bash tutu=$1 titi=$2 mkdir -p /home/xbmc/$tutu/$titi
Et voila ce que je cherche à faire fonctionner:

php:
$var_fichier = $_FILES['addmusic_path']['name'];
$var_titre = $_POST['addmusic_titre'];
$var_artist = $_POST['addmusic_artiste'];
$var_album = $_POST['addmusic_album'];
$var_genre = $_POST['genre'];
$var_date=$_POST['addmusic_annee'];
$var_number= $_POST['addmusic_number'];
 						
exec(escapeshellcmd('scripts/aj_musique.sh '.$var_fichier.' '.$var_titre.' '.$var_artist.' '.$var_album.' '.$var_genre.' '.$var_date.' '.$var_number));
bash:

Code : Tout sélectionner

#!/bin/bash var_fichier=$1 chemin_musique=../upload/$var_fichier extension=${chemin_musique##*.} var_titre=$2 var_artist=$3 var_album=$4 var_genre=$5 var_date=$6 var_number=$7 if [ ! -d /home/xbmc/musique/$var_artist/$var_album ] then mkdir -p /home/xbmc/musique/$var_artist/$var_album fi touch /home/xbmc/musique/$var_artist/$var_album/$var_titre.nfo echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\" ?> <music> <title>"$var_titre"</title> <artist>"$var_artist"</artist> <album>"$var_album"</album> <genre>"$var_genre"</genre> <year>"$var_date"</year> <number>"$var_number"</number> </music>" > /home/xbmc/musique/$var_artist/$var_album/$var_titre.nfo cp $chemin_musique /home/xbmc/musique/$var_artist/$var_album/$var_titre.$extension
Le truc c'est qu'il ne me crée rien... Et je ne comprends pas pourquoi :/

Re: Exécution de script shell via PHP

par xTG » 14 mars 2013, 06:25

Pour récupérer les paramètres d'un script shell : http://www.linux-france.org/article/dal ... .htm#param