Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile

Encore une fois, merci smile

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 smile
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