Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
shell script et code d'erreur global
Envoyé par: NBaH

bonjour à tous

J'ai mis toutes mes commandes iptables dans un fichier. Si j'insère une erreur dans le script (genre 'ptables') avant la dernière commande, bash renvoie un message d'erreur, pourtant 'echo $?' renvoie 0 : c'est normal, la dernière commmande, elle, ne comporte pas d'erreur! Mais il y a pourtant bien eu une erreur.
Existe-t-il une manip pour additionner les codes de retour? ou pour que le script renvoie une valeur globale tenant compte d'une erreur de l'une des commandes?
J'ai mis toutes les commandes iptables à la suite l'une de l'autre en passant simplement à la ligne.

Poste le Friday 11 January 2008 03:09:54
Répondre     Citer    
Re: shell script et code d'erreur global
Envoyé par: chromosome

Pour ton script je vois pas comme ca directement, mais pourquoi ne pas utiliser les fonctions comme iptables-restore/iptables-save ca te permettrait de ne pas a avoir ce genre d'erreur. Mais si tu veux absolument un script, pourquoi ne pas definir une variable en haut avec le nom du script et utiliser cette variable a chaque fois ?

Sinpn pour ton script, hormis faire un test apres chaque commande et de faire un return avec une valeur en cas d'erreur, ou alors de passer par une function dans ton script et celle-ci execute iptables, ca te permettrais de centraliser les commandes a un seul endroit.


Poste le Friday 11 January 2008 22:26:06
Répondre     Citer    
Re: shell script et code d'erreur global
Envoyé par: NBaH

Je voudrais utiliser un script pour mettre un petit message personalisé selon l'état du filtre : certains sous-réseaux ne doivent pas avoir de connexion internet à certain moment de la journée, et donc pour me tenir au courant : messages personnalisés colorés, alarmes sonores (bientôt la cafetière qui se met en marche... ^^). Et puis j'ai pas fini la configuration de netfilter car j'ai un port 21 qui reste obstinément béant.

Il est vrai qu'à coup de crontab... avec iptables-save/restore et un script pour les messages...

Pourquoi faire simple quand on peut faire compliquer ?

Citation
chromosome
pourquoi ne pas definir une variable en haut avec le nom du script et utiliser cette variable a chaque fois ?
???

Citation
chromosome
faire un return avec une valeur en cas d'erreur,
genre
RETVAL=0
if [ RETVAL -eq 0 ]
then ...
else ...
fi
?

Citation
chromosome
ou alors de passer par une function dans ton script et celle-ci execute iptables, ca te permettrais de centraliser les commandes a un seul endroit.
Si je passe les commandes iptables dans une fonction, bash renvoie le numéro de ligne où il y a une erreur. Y a un mieux, mais j'ai pas mes messages perso.

Je pensais qu'il était possible de rediriger les messages (ou les codes) d'erreur de bash dans un fichier, puis vérifier le contenu du fichier avec grep, etc [v]ça a l'air vraiment tordu.[/v]

Poste le Monday 14 January 2008 08:15:04
Répondre     Citer    
Re: shell script et code d'erreur global
Envoyé par: NBaH

Citation
NBaH
Si je passe les commandes iptables dans une fonction, bash renvoie le numéro de ligne où il y a une erreur. Y a un mieux, mais j'ai pas mes messages perso.
ah non c'est moi qui avait oublier un "fi"

Donc si je met les commandes iptables dans une fonction, et qu'après celle-ci je met
RETVAL=0
if [ RETVAL -eq 0 ]
then ...
else ...
fi
je reçois : "-bash: [: RETVAL: integer expression expected", ce qui est normal, puisque j'ai oublié un "$".

Donc j'en reviens à
Citation
NBaH
???

Poste le Monday 14 January 2008 08:38:22
Répondre     Citer    
Re: shell script et code d'erreur global
Envoyé par: oudoubah

Pour la variable globale, tu peux faire de la sorte :

#!/bin/sh

errno=0

iptables ..... || errno=$(($errno + 1))
iptables ..... || errno=$(($errno + 2))
iptables ..... || errno=$(($errno + 4))
iptables ..... || errno=$(($errno + 8))
iptables ..... || errno=$(($errno + 16))
iptables ..... || errno=$(($errno + 32))
iptables ..... || errno=$(($errno + 64))

exit $errno

Le code de retour de ton script correspondra à la somme des codes d'erreur.

Le problème avec une telle variable globale, c'est que c'est assez lourd.

Une version plus simple (mais qui implique de parser soit un fichier de log, soit stderr/stdout) :
#!/bin/sh

LOG=/var/logs/monlog

errno=0

erreur() {
   code=$1
   shift
   message="$*"
   echo "$code|$message" >> $LOG
   errno=$(($errno + 1))
}

iptables .... || erreur 1 "Port www réseau 1"
iptables .... || erreur 2 "Port ftp réseau 1"
iptables .... || erreur 3 "Port www réseau 2"
iptables .... || erreur 3 "Port www réseau 3"

exit $errno

Le code de retour du script correspond au nombre d'erreurs rencontrées.

Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

Poste le Monday 14 January 2008 13:17:42
Répondre     Citer    
Re: shell script et code d'erreur global
Envoyé par: NBaH

Ah! J'entend le glouglou de la cafetière...^^

[^]Je plaisante, mais un jour... qui sait...[/^]

Merci, c'est plus que ce que j'espérais.

J'ai opté pour le second script, qui apporte plus de précision, car le "$message" renvoie à la commande en cause.

Encore merci.

Poste le Tuesday 15 January 2008 01:14:46
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
shell script et code d'erreur global
Un problème avec une commande du shell ? Comment utiliser la crontab ? Vous avez des soucis pour la gestion réseau sous Linux ? Pour vous la gestion des utilisateurs/groupes est du chinois ? Etc... Posez donc vos questions ici.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons