Exécution de script shell via PHP

Eléphanteau du PHP | 17 Messages

14 mars 2013, 00:50

Bonjour à tous,

Je viens poster mon problème ici car j'ai un soucis; je n'arrive pas a lancer un script shell via mon PHP, il ne semble pas s’exécuter.

Voici le principe: on upload un fichier grâce à un formulaire dans un dossier "upload" sur le serveur debian, le but du script est ensuite de couper ce fichier vers le dossier "/home/xbmc".

Voici les fichiers PHP:

addmusique.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
		<title>StarBox - Musique</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" media="screen" type="text/css" title="Design" href="style/css/style.css" />
	</head>
	<body>
		<?php
		session_start();
		require_once('db.php');
		include("header.php");
		
		if (!isset($_SESSION['login'])) {
			echo '<div class="error"><p>Vous devez vous connecter pour accéder à cette page.</p></div>';
			session_destroy();
			header ("Refresh: 2;URL=index.php");
		}
		else {
			?>
			
			<div class="starbox">
			
			<?php echo "Bonjour " . $_SESSION['login'] . "."; ?>
			
			<form class="starbox" name="addmusic" method="post" action="business_addmusic.php" enctype="multipart/form-data" OnSubmit="return Send()">
			<a href="home.php"><< Accueil</a> <br />
			<h1>Ajouter une musique</h1>
			<table class="addmusic">
				<tr colspan="2">
					<td>Fichier à ajouter:<br />
					<input name="addmusic_path" type="file" />*<br /><br /></td>
				</tr>
				<tr>
					<td>Titre:<br />
					<input type="text" name="addmusic_titre" />*<br /><br /></td>
					<td>Artiste: <i>(Laisser vide si inconnu)</i><br />
					<input type="text" name="addmusic_artiste" /><br /><br /></td>
				</tr>
				<tr>
					<td>Numéro de piste: <i>(Laisser vide si inconnu)</i><br />
					<input type="text" name="addmusic_number" /><br /><br /></td>
					<td>Nom de l'album: <i>(Laisser vide si inconnu)</i><br />
					<input type="text" name="addmusic_album" /><br /><br /></td>
				</tr>
				<tr>
					<td>Année:<i>(Laisser vide si inconnu)</i><br />
					<input type="text" name="addmusic_annee" /><br /><br /></td>
				</tr>
				<tr>
					<td colspan="2">Genre:<br />
								<?php 
								$genresmusic=$database->query('SELECT GENRE_ID, GENRE_NOM FROM genre WHERE GENRE_TYPE = 1 ORDER BY GENRE_NOM');
								while($val = $genresmusic->fetch())
								{
									echo '<input type="radio" name="genre" value="'.$val['GENRE_NOM'].'" id="'.$val['GENRE_ID'].'" /> <label for="'.$val['GENRE_ID'].'">'.$val['GENRE_NOM'].'</label><br />';
								}
								?>
					<br /><br /></td>
				</tr>
				<tr>
					<td>Confidentialité:<br />
					<input type="checkbox" id="private" name="confidentialite" value="Privé"/><label for="private">Privé</label><br /><br /></td>
				</tr>
			</table>
			<input type="submit" value="Ajouter la musique" />
			</form>
			</div>
			<?php 
		}
		?>
	</body>
</html>


business_addmusique.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
	<head>
		<title>Redirection...</title>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
		<link rel="stylesheet" media="screen" type="text/css" title="Design" href="style/css/style.css" />
	</head>
	<body>
		<?php
		session_start();
		require_once('db.php');
		include("header.php");
		
		if (!isset($_SESSION['login'])) {
			echo '<div class="error"><p>Vous devez vous connecter pour accéder à cette page.</p></div>';
			session_destroy();
			header ("Refresh: 2;URL=index.php");
		}
		else {
			
			
			if ($_FILES['addmusic_path']['name'] != "" and $_POST['addmusic_titre'] != "") {
				
				if ($_POST['addmusic_artiste'] == "") {
					$_POST['addmusic_artiste'] = "Inconnu";
				}
				
				if ($_POST['addmusic_number'] == "") {
					$_POST['addmusic_number'] = "NA";
				}
				
				if ($_POST['addmusic_album'] == "") {
					$_POST['addmusic_album'] = "Inconnu";
				}
				
				if ($_POST['addmusic_annee'] == "") {
					$_POST['addmusic_annee'] = "Inconnue";
				}
				
				if (!isset($_POST['genre'])) {
					$_POST['genre'] = "Divers";
				}
				
				if (isset($_POST['confidentialite'])) {
					$_POST['confidentialite'] = 1;
				}
				else {
					$_POST['confidentialite'] = 0;
				}
				
				$idgenre=$database->prepare('SELECT GENRE_ID FROM genre WHERE GENRE_NOM = "'.$_POST['genre'].'" AND GENRE_TYPE = 1');
				$idgenre->execute();
				$data = $idgenre->fetch();
				
				$_SESSION['idgenre'] = $data['GENRE_ID'];
									
 				$dossier = 'upload/';
 				$fichier = basename($_FILES['addmusic_path']['name']);
 				$taille = filesize($_FILES['addmusic_path']['tmp_name']);
 				$extensions = array('.mp3', '.ogg', '.wav', '.aac', '.m4a', '.flac', '.wma', '.MP3', '.OGG', '.WAV', '.AAC', '.M4A', '.FLAC', '.WMA');
 				$extension = strrchr($_FILES['addmusic_path']['name'], '.');
 				//Début des vérifications de sécurité...
 				if(!in_array($extension, $extensions)) //Si l'extension n'est pas dans le tableau
 				{
 					$erreur = '<div class="error">Vous devez envoyer une musique de type mp3, ogg, wav, aac, m4a, flac ou wma.</div>';
 				}
 				
 				if(!isset($erreur)) //S'il n'y a pas d'erreur, on upload
 				{
 					//On formate le nom du fichier ici...
 					if(move_uploaded_file($_FILES['addmusic_path']['tmp_name'], $dossier . $fichier)) //Si la fonction renvoie TRUE, c'est que ça a fonctionné...
 					{
 						$addmusic=$database->prepare('INSERT INTO fichier(GENRE_ID, TYPE_ID, FICHIER_NOM, FICHIER_CHEMIN, FICHIER_ANNEE, FICHIER_ARTISTE, FICHIER_ALBUM, FICHIER_PRIVE, FICHIER_PROPRIO, FICHIER_NUMERO) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
 						$addmusic->execute(array($_SESSION['idgenre'], 1, $_POST['addmusic_titre'], $_FILES['addmusic_path']['name'], $_POST['addmusic_annee'], $_POST['addmusic_artiste'], $_POST['addmusic_album'], $_POST['confidentialite'], $_SESSION['user_id'], $_POST['addmusic_number']));
 						
 						exec(escapeshellcmd('scripts/aj_musique.sh', $_FILES['addmusic_path']['name'], $_POST['addmusic_titre'], $_POST['addmusic_artiste'], $_POST['addmusic_album'], $_POST['genre'], $_POST['addmusic_annee'], $_POST['addmusic_number']));
 						
 						echo '<div class="success">Musique ajoutée.</div>';
						unset($_SESSION['idgenre']);
						unset($_FILES['addmusic_path']['name']);
						unset($_POST['addmusic_titre']);
						unset($_POST['addmusic_artiste']);
						unset($_POST['addmusic_number']);
						unset($_POST['addmusic_album']);
						unset($_POST['addmusic_annee']);
						unset($_POST['genre']);
						unset($_POST['confidentialite']);
						header ("Refresh: 2;URL=musique.php");
 					}
 					else //Sinon (la fonction renvoie FALSE).
 					{
 						print_r($_FILES);
 						echo $fichier;
 						echo '<div class="error">Échec de l\'upload !</div>';
 					}
 				}
 				else
 				{
 					echo $erreur;
 				}
				
				
			}
			else {
				echo '<div class="error">Merci de remplir tous les champs obligatoires.</div>';
				unset($_SESSION['idgenre']);
				unset($_POST['addmusic_path']);
				unset($_POST['addmusic_titre']);
				unset($_POST['addmusic_artiste']);
				unset($_POST['addmusic_number']);
				unset($_POST['addmusic_album']);
				unset($_POST['addmusic_annee']);
				unset($_POST['genre']);
				unset($_POST['confidentialite']);
				header ("Refresh: 2;URL=musique.php");
			}
 		}
		?>

Et enfin, le script shell que je cherche à exécuter:

aj_musique.sh:

Code : Tout sélectionner

#!/bin/bash chemin_film="../upload/$_FILES['addmusic_path']['name']" extension="${chemin_film##*.}" 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']" 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_film" /home/xbmc/musique/"$var_artist"/"$var_album"/"$var_titre"."$extension" #echo /home/xbmc/musique/"$var_artist"/"$var_album"/"$var_titre"."$extension"

Étant donné que je suis très mauvais sur Linux, il ne serait pas impossible qu'il manque des droits quelque part...

J'ai juste mis le dossier "upload" en 777 (via filezilla). Ce n'est pas très grave pour la sécurité, l’application est destinée à être utilisée en local.

PS: Je n'ai aucun message d'erreur, j'ai l'impression que le script shell ne s'exécute simplement pas, l'upload, lui, fonctionne correctement.

Je vous remercie par avance pour toute l'aide que vous pourrez m'apporter.

Cordialement,
Sayko.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 mars 2013, 01:05

salut,


le problème c'est que tu mélange php et le script shell.

tu n'as pas accès aux variables php dans ton script, par contre tu les passe en paramètre a toi de les récupérer correctement dans le script shell, mais en aucun cas tu ne doit avoir de code php dans ce script !!!

de la doc, il y a ce qu'il te faut : http://doc.ubuntu-fr.org/tutoriel/script_shell même si c'est un peu limité ;)


@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 17 Messages

14 mars 2013, 01:20

Tout d'abord merci beaucoup pour ta réponse :D.

Ohlala... Je tilt pas grand chose et en plus je dois finir ce truc pour vendredi matin :s

Avec un simple "mkdir /home/xbmc/" cela fonctionne.

Le problème est que je n'arrive pas a récupérer la valeur de mes variables PHP au sein de mon script shell. Et là je vois vraiment pas comment faire.

J'ai changé la ligne d'exécution, elle me semble à présent plus correcte:
exec(escapeshellcmd("scripts/aj_musique.sh ".$_FILES['addmusic_path']['name']." ".$_POST['addmusic_titre']." ".$_POST['addmusic_artiste']." ".$_POST['addmusic_album']." ".$_POST['genre']." ".$_POST['addmusic_annee']." ".$_POST['addmusic_number']));
Et le script:

Code : Tout sélectionner

#!/bin/bash chemin_musique="../upload/$_FILES['addmusic_path']['name']" extension=${chemin_musique##*.} 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'] 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_film /home/xbmc/musique/$var_artist/$var_album/$var_titre.$extension #echo /home/xbmc/musique/$var_artist/$var_album/$var_titre.$extension
Je suis paumé et je commence un peu à désespérer en voyant la deadline arriver :s

ViPHP
xTG
ViPHP | 7331 Messages

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

Eléphanteau du PHP | 17 Messages

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 :/
Modifié en dernier par Sayko le 14 mars 2013, 12:43, modifié 1 fois.

Mammouth du PHP | 571 Messages

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

Mammouth du PHP | 571 Messages

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"));
?>

Eléphanteau du PHP | 17 Messages

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
Modifié en dernier par Sayko le 14 mars 2013, 13:51, modifié 2 fois.

Mammouth du PHP | 571 Messages

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.

Eléphanteau du PHP | 17 Messages

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
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Eléphanteau du PHP | 17 Messages

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. :/

Mammouth du PHP | 571 Messages

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\" ");

Mammouth du PHP | 571 Messages

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.

Eléphanteau du PHP | 17 Messages

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/

Mammouth du PHP | 571 Messages

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"