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 Christophe --- . Évalué à 2.
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 Francis Einstein . Évalué à 1.
[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 Joris Dedieu (site web personnel) . Évalué à 1.
# export LANG=C
Posté par Barnabé . Évalué à 9.
«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 Francis Einstein . Évalué à 1.
Avec un "export LANG=fr_FR" mon script marche parfaitement.
# cron != shell
Posté par Kerro . Évalué à 2.
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 Francis Einstein . Évalué à 2.
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.