Forum Programmation.shell Problème d'initialisation de variables dans Bash lorsque cron lance le script

Posté par  .
Étiquettes :
-1
2
sept.
2008
Salut à tous!
Je viens de réaliser un script bash qui me permet de récupérer l' adresse ip de mon interface réseau eth3 et de comparer cette dernière avec une autre adresse ip mon réseau local. Mon OS: Fedora core 6.

#!/bin/bash
PATH='/sbin:/bin:/usr/sbin:/usr/bin';

ip_discover_comp() {
OTHER_IP=$1
TMP_IPADDR='';
TMP_IPADDR=`/sbin/ifconfig eth3 | /bin/awk '($0~"inet adr"){gsub("adr:","");print $2}'`

if [ "${TMP_IPADDR}" = "${OTHER_IP}" ]
then
return 0
else
return 1
fi
}

if ip_discover_comp 192.168.0.10
then
echo "${TMP_IPADDR} meme adresse" > /root/ok.out
else
echo "${TMP_IPADDR} adresse diff" > /root/nok.out
fi

exit 0

Il s'avere que mon interface eth3 dispose de l'adresse 192.168.0.10 et lorsque je lance mon script dans un terminal j'obtiens le résultat :
[root@wanche ~]# ./script.sh
[root@wanche ~]# cat /root/ok.out
192.168.0.10 meme adresse

ce qui est le résultat attendu.
Le problème se pose lorsque je lance le meme script dans un cron:
[root@wanche ~]# crontab -l
*/1 * * * * /root/script.sh

cette fois c'est le fichier "/root/nok.out" qui est créé et a pour contenu " adresse diff"", il est donc clair que la variable qui contient l'adresse IP de mon interface est vide ou que la comparaison " ${TMP_IPADDR}" = "${OTHER_IP} " est mauvaise.
Je voudrais donc savoir comment modifier ce script afin d'avoir le même résultat que lorsqu'on l'exécute dans un terminal.

Merci à tous!
  • # Lancer en mode debug?

    Posté par  . Évalué à 2.

    Bonjour,

    Un premier point serait de regarder où cela se passe mal. Pour ce faire, tu peux rajouter l'option -x dans la première ligne. Ceci fait, l'éxécution du script va afficher chaque commande exécutée. D'après la doc de crontab, tu devrais obtenir le tout dans le mail de l'utilisateur en question (donc root).


    PS: Et si tu peux faire tes essais avec un compte user plutôt que root, tu pourrais t'éviter de mauvaises surprises...
    • [^] # Re: Lancer en mode debug?

      Posté par  . Évalué à 1.

      Voici ce que j'obtiens après redirection dans un fichier:
      [root@wanche ~]# cat script.log
      + PATH=/sbin:/bin:/usr/sbin:/usr/bin
      + ip_discover_comp 192.168.0.10
      + OTHER_IP=192.168.0.10
      + TMP_IPADDR=
      ++ /sbin/ifconfig eth3
      ++ /bin/awk '($0~"inet adr"){gsub("adr:","");print $2}'
      + TMP_IPADDR=
      + '[' '' = 192.168.0.10 ']'
      + return 1
      + echo ' adresse diff'
      + exit 0
  • # Sortie

    Posté par  (site web personnel) . Évalué à 1.

    Pense aussi a rediriger les sortie 2 >&1 vers un mail ou un fichier :)
  • # export LANG=C

    Posté par  . Évalué à 9.

    En francais, ifconfig renvoie «inet adr:192.168.0.10», alors qu'en anglais, c'est
    «inet addr:192.168.0.10», avec 2 d.

    Ton environnement doit être en français, et celui de cron en anglais.

    Il est bon, lorsqu'on écrit des scripts utilisant la sortie d'autres programmes, d'utiliser LANG=C, afin de ne pas tomber dans ce genre de piège.
    • [^] # Re: export LANG=C

      Posté par  . Évalué à 1.

      Merci Barnabé pour tes remarques, c'est exactement ce qu'il me fallait.
      Avec un "export LANG=fr_FR" mon script marche parfaitement.
  • # cron != shell

    Posté par  . Évalué à 2.

    Attention, cron n'hérite pas de ton shell, donc il n'hérite pas des variables, ni des locales, etc. C'est expliqué dans la page de manuel.
    La plupart des problèmes viennent de là.
    Comme indiqué plus haut, ton problème est quasi-certainement dû aux locales.

    Un bon moyen de t'affranchir du problème des locales avec ifconfig est soit de ne tenir compte que de la seconde ligne (facile avec sed), soit de ne tenir compte que de la ligne contenant 3 fois le motif d'une adresse IP (adresse, diffusion, masque) (facile avec sed également).

    Exemple:
    ifconfig eth0 | sed -n 's#.*:\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*:\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*:\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*#\1 \2 \3#p'
    te donne l'adresse ip suivie de l'adresse de diffusion suivie du masque.
    Si tu veux uniquement l'adresse:
    ifconfig eth0 | sed -n 's#.*:\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*:[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}.*:[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}.*#\1#p'
    • [^] # Re: cron != shell

      Posté par  . Évalué à 2.

      Merci Kerro pour tes remarques sur les les locales dans shell et cron et pour lutilisation de la commande sed.

      Merci à tous!

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.