#1 Le 30/07/2007, à 20:45
- bigcortex
Question pour les gurus du scriptage shell
Bonjour
Je dois pondre un petit script shell qui doit parcourir un fichier.
Chaque ligne doit être décomposée et les informations extraites doivent permettent de lancer une commande.
Voici un apercu du contenu d'une ligne:
fichier_sortie.txt fichier_entree.txt "parametre1" "parametre2" "parametre3" "parametreN"
À noter, il peut y avoir n parametres...
Le script doit decomposer cette ligne afin de lancer la commande suivante:
nomduprogramme --input fichier_entree.txt --parameter "parametre1" --parameter "parametre2" --parameter "parametreN"
Je connais pas trop les expressions regulieres de shell et j'arrive pas a decomposer ma ligne (le caractere de séparation est l'espace).
Je sais qu'en php, je fais un explode, et c'est réglé, mais j'ai du mal à faire cela en shell.
while true
do
#----- Fichier contenant les commandes
myFile="/home/bigcortex/Desktop/tests/commandes.txt"
#----- Variable qui contient les lignes de chaque fichier
myLine=""
#----- Parcours des lignes du fichier
while [ 1 ]
do
read myLine || break
echo "$myLine"
done < $myFile
sleep 1
done
Dernière modification par bigcortex (Le 30/07/2007, à 20:45)
Hors ligne
#2 Le 30/07/2007, à 20:52
- scholi
Re : Question pour les gurus du scriptage shell
regardes comment fonction awk, ce petit programme est génial et permettra de faire ce que tu cherches en une seul ligne!
EDIT: Sinon j'ai un peu de peine à comprendre le rapport entre ton dernier code et ce que tu cherches à faire. C'est quoi le fichier texte que tu lis??
Sinon pour le faire en shell sur plusieurs ligne, utilises $1,$2,... qui sont les nième paramètres
EDIT: Voir la solution complète dans mon post suivant
Dernière modification par scholi (Le 30/07/2007, à 22:51)
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Hors ligne
#3 Le 30/07/2007, à 21:38
- bigcortex
Re : Question pour les gurus du scriptage shell
Merci, je pense que ca devrait faire l'affaire.
Hors ligne
#4 Le 30/07/2007, à 22:48
- scholi
Re : Question pour les gurus du scriptage shell
Mon exemple précédent ne marchait pas! Voici LA SOLUTION
#!/bin/bash
x="nomduprogramme --input $1 --output $2"
shift 2
for i in $*
do
x="$x --parameter $i"
done
echo $x | bash
INFOS
====
$* = la liste des arguments.
shift 2 permet de "virer" les 2 premier arguments. Donc $3 devient $1, $4 devient $2, etc...
et le echo $x imprime la commande à l'écran et le pipe | bash permet de l'exécuter.
Des questions?
Dernière modification par scholi (Le 30/07/2007, à 22:58)
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Hors ligne
#5 Le 31/07/2007, à 14:51
- bigcortex
Re : Question pour les gurus du scriptage shell
Génial, ca marche parfaitement
Encore une fois, merci
En fait j'ai quand même une question.
Si je me donnes tout ce mal à stocker de cette façon les paramères d'appels de fonctions au lieu d'y inscrire directement la commande à éxécuter, c'est que je veux éviter qu'une personne puisse injecter une commande malicieuse si elle à arrive à accéder au fichier texte.
Est-ce qu'il serait possible dans cette configuration d'injecter une commande déguisée sous forme de paramètre (par exemple rm *) et de faire en sorte qu'elle s'éxecute?
Dernière modification par bigcortex (Le 31/07/2007, à 15:08)
Hors ligne
#6 Le 31/07/2007, à 15:50
- abetsic
Re : Question pour les gurus du scriptage shell
Peut-être en rajoutant "; rm /home" après le dernier paramètre.
Hors ligne
#7 Le 31/07/2007, à 16:18
- scholi
Re : Question pour les gurus du scriptage shell
je comprend pas très bien ton truc.... On peux toujours lancer un xterm et faire rm -rf /home sans passer par ton scripte. Où est réellement son utilité? Sinon, si l'utilisateur n'a pas les droit root, il ne pourra pas effacer n'importe quoi. Il pourra seulement effacer ce qui se trouve sous /home/nom_de_login
Il pourra donc au pire détruire ses propres fichiers (mais bon ça c'est son problème)...
EDIT: Ah, veux-tu dire que les utilisateurs écrivent des argument dans un fichier texte et que root exécute le scripte que je t'ai donné?
Dans se cas, c'est simple il suffit de vérifier qu'il n'y a pas de ";" dans le fichier source
myLine=`grep -v ; /home/bigcortex/Desktop/tests/commandes.txt`
grep recherche les lignes où il N'Y A PAS (ça c'est l'argument -v) le caractère ; dans le fichier /home/...
Dernière modification par scholi (Le 31/07/2007, à 16:27)
S'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
Hors ligne
#8 Le 31/07/2007, à 17:16
- bigcortex
Re : Question pour les gurus du scriptage shell
C'est cela
Les utilisateurs pourront éditer le fichier texte de manière indirecte. En fait le fichier va être généré par php selon ce que l'utilisateur a saisi.
J'effectue déjà un premier contrôle avec php pour m'assurer que les données ne sont pas malicieuses, mais J'aimerais assurer mes arrières en faisant une vérification par le script shell également.
Faut-il aussi bannir le caractère & ?
Hors ligne
#9 Le 31/07/2007, à 17:40
- abetsic
Re : Question pour les gurus du scriptage shell
A priori & ne devarit pas poser de problèmes. Ce serait plutôt "&& cmd" situé parmi les arguments : Une fois que la première commande s'est terminée sans problèmes "cmd" est executée.
Tu peux aussi vérifier la présence de "||" qui autorises l'execution de ce qui suit au cas où la première commande échoue.
ps : Es-tu sûr d'avoir besoin des droits root pour ce que tu veux faire ?
Hors ligne