#1 Le 17/08/2018, à 13:52
- arlandria64
[script/bash] Besoin d'aide sur un script ping
Bonjour à tous.
J'essaie de faire un script qui ping plusieurs ips et envoie un mail si l'une d'entre elle n'est pas joignable.
Lorsque je lance le script manuellement (./script.sh) le script fonctionne parfaitement bien. il envoie le mail quand il faut et le n'envoie pas quand il ne le faut pas.
Par contre, lorsque je mets mon script dans une tache cron, qui s’exécute toutes les minutes, je vois dans les logs une tentative d'envoie de mail alors qu'il n'y a aucune raison d'envoyer le mail...
script.sh :
#!/bin/bash
temps=`date -d 'now' '+%F %T'`
for i in $( cat $HOME/Scripts/PingV2/iplist )
do
ping -q -c1 $i > /dev/null
if [ $? -eq 0 ]
then
echo $i "OK"
sed -i -e /^$i/d $HOME/Scripts/PingV2/injoignable #Si le switch est up, on le supprime des injoignables
sed -i -e /^$i/d $HOME/Scripts/PingV2/mailenvoye
elif [[ `cat $HOME/Scripts/PingV2/mailenvoye` = $i ]]
then
echo "mail deja envoye"
elif grep -q "$i" $HOME/Scripts/PingV2/injoignable # Si l'ip est présente dans le fichier,
then
echo "Ne fais rien."
else
echo $i >> $HOME/Scripts/PingV2/mailenvoye
echo $i "depuis :" $temps >> $HOME/Scripts/PingV2/injoignable
/usr/sbin/sendmail "adressemail@mail.fr" < $HOME/Scripts/PingV2/injoignable
fi
done
scripttroisheures.sh
#!/bin/bash
for i in $( cat $HOME/Scripts/PingV2/iplist )
do
if grep -q "$i" $HOME/Scripts/PingV2/injoignable
then
echo "envoie mail"
/usr/sbin/sendmail "adressemail@mail.fr" < $HOME/Scripts/PingV2/injoignable
else
echo "envoie pas mail"
fi
done
injoignable :
From: mail@mail.fr
To: mail2@mail.fr
Subject: ping check
IP depuis : 2018-08-17 14:34:43
Une image du log mail :
http://i.imgur.com/gcORQ8O.png
Le script.sh est celui qui s'execute toutes les minutes.
Le scripttroisheures.sh est celui qui s'execute toutes les 3h pour me rappeler qu'un switch est toujours down et ainsi évité d'être spammé de mails.
N'hésitez pas a poser des questions si vous ne comprenez pas le script.
Egalement, s'il y a des erreurs, n'hésitez pas a me les signaler. Je ne sais pas coder dans ce langage, j'ai juste bricolé des scripts trouvés içi et là ...
Merci pour votre aide !
Dernière modification par arlandria64 (Le 17/08/2018, à 14:24)
Hors ligne
#2 Le 17/08/2018, à 14:16
- Watael
Re : [script/bash] Besoin d'aide sur un script ping
salut,
pourquoi pastebin pour trois bouts de code ?
poste le code entre balise code (le bouton <>), en éditant ton message, stp.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 17/08/2018, à 14:25
- arlandria64
Re : [script/bash] Besoin d'aide sur un script ping
Bonjour,
C'est fait.
Désolé pour la gène
Dernière modification par arlandria64 (Le 17/08/2018, à 14:27)
Hors ligne
#4 Le 17/08/2018, à 14:59
- Watael
Re : [script/bash] Besoin d'aide sur un script ping
merci.
d'abord
le fichier qui liste les adresses injoignableS peut contenir plusieurs adresses, donc il n'est pas certain que le contenu du fichier corresponde exactement à l'adresse en cours de traitement.
ensuite,
il ne doit y avoir que deux conditions principales :
- ping réussi
- ping échoue
et dans ce dernier cas, une seule "sous" condition :
- un mail a-t-il été déjà envoyé
si tu ne fais rien, ce n'est pas a peine de le dire !
en sus,
un fichier se lit avec une boucle while (ça évite les UUOC);
if teste une commande, donc directement
if ping...
Dernière modification par Watael (Le 17/08/2018, à 15:00)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 17/08/2018, à 21:57
- arlandria64
Re : [script/bash] Besoin d'aide sur un script ping
Bonsoir,
Merci de prêter attention a mon problème.
Il est évident que mon script comporte des erreurs ou des maladresses.
Effectivement, la double vérification n'est pas utile.
Cependant, et c'est là ma demande, mon script fonctionne parfaitement si je l'execute manuellement.
C'est uniquement rentré dans la crontab qu'il cherche en permanence a envoyer un mail alors que les conditions sont tout le temps vérifiées pour qu'il n'envoie pas de mail...
Ce mail n'est d'ailleurs jamais envoyé, comme le montre le screenshot.
Dans la crontab, lors de la première exécution et en simulant un ping fail, l'envoie du mail d'alerte se fait bien et c'est voulu.
Lors de l’exécution suivante, il ne doit pas envoyer de mail mais il essaie quand même et échouant.
Pourquoi est-ce que mon script réagit différemment lorsque je l’exécute manuellement et lorsqu'il est exécuté avec la crontab ?
Hors ligne
#6 Le 18/08/2018, à 08:02
- arlandria64
Re : [script/bash] Besoin d'aide sur un script ping
Je viens d'essayer d'enlever toutes les conditions, voilà mon script.sh actuellement:
#!/bin/bash
temps=`date -d 'now' '+%F %T'`
for i in $( cat $HOME/Documents/Scripts/PingV2/iplist )
do
ping -q -c1 $i > /dev/null
if [ $? -eq 0 ]
then
echo $i "OK"
fi
done
Et un screnshot de mail.log ainsi que de ma crontab :
https://image.noelshack.com/fichiers/20 … -00-56.png
https://image.noelshack.com/fichiers/20 … -02-01.png
Je ne comprend absolument pas pourquoi il essaye en permanence d'envoyer le mail alors que le code n'y est même plus !!
Hors ligne
#7 Le 18/08/2018, à 09:30
- Watael
Re : [script/bash] Besoin d'aide sur un script ping
cron envoie un mail (sans sujet ?! tu ne l'as pas ouvert ?) parce que le script affiche quelque chose, non ?
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#8 Le 18/08/2018, à 12:05
- arlandria64
Re : [script/bash] Besoin d'aide sur un script ping
Cron ne m'a rien envoyé.
Dans le mail.log on peut voir que mon script essaie d'envoyer quelque chose et échoue.
Le script lit le fichier iplist, fais un ping et si ça marche il m'écrit "ok" sinon il fait rien du tout.
Y'a rien qui lui demande d'envoyer un mail ... Pourtant, toutes les minutes (éxécution de mon script toutes les minutes, donc ça vient de là), il essaye d'envoyer un mail en échouant.
Je ne comprends plus rien ahah
Hors ligne
#9 Le 18/08/2018, à 12:14
- Watael
Re : [script/bash] Besoin d'aide sur un script ping
si tu ne t'es pas trompé de version de script, et que le script n'a pas d'instruction pour envoyer un mail, alors c'est cron.
« Une fois qu’on a éliminé l’impossible, ce qui reste, aussi improbable que cela soit, doit être la vérité»
si un script exécuté par cron affiche des informations, cron les envoie par mail sur la boîte locale de l'utilisateur propriétaire de la crontab.
mais pourquoi ssmtp croit-il devoir envoyer les mails système sur un autre domaine que la machine locale ?...
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#10 Le 18/08/2018, à 17:39
- arlandria64
Re : [script/bash] Besoin d'aide sur un script ping
J'avoue ne pas comprendre ...
Y'a rien dans mon script et pourtant, si je commande la ligne dans la crontab, y'a plus de tentatives donc ça vient bien du script ...
Je comprends pas.
Quelqu'un a une idée ?
Hors ligne
#11 Le 18/08/2018, à 17:46
- diesel
Re : [script/bash] Besoin d'aide sur un script ping
Es-tu certain que c'est le script et pas cron lui-même qui envoie le mail ?
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 18/08/2018, à 17:46)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
En ligne
#12 Le 18/08/2018, à 18:23
- arlandria64
Re : [script/bash] Besoin d'aide sur un script ping
J'ai trouvé.
J'ai rajouté ">/dev/null 2>&1" à la fin de la ligne dans cron et il n'essaie plus d'envoyer de mails sans raisons et en envoie quand il faut.
Impec !
https://image.noelshack.com/fichiers/20 … -22-56.png
Pour fermer le sujet, il faut simplement rajouter [résolu] dans le titre ?
Modération - Merci de remplacer cette image inutilement lourde par le texte entre balises code
Dernière modification par cqfd93 (Le 18/08/2018, à 19:11)
Hors ligne
#13 Le 18/08/2018, à 18:36
- Watael
Re : [script/bash] Besoin d'aide sur un script ping
ou alors, tu commentes les lignes qui comportent un echo dans ton script, pour qu'il ne fasse vraiment rien, même pas le dire, s'il n'y a rien à faire.
si ça continue de "mailer" c'est qu'il y a une erreur dans ton script, il faut lire le message pour débugguer...
« Une fois qu’on a éliminé l’impossible, ce qui reste, aussi improbable que cela soit, doit être la vérité » !!!
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 19/08/2018, à 06:39
- arlandria64
Re : [script/bash] Besoin d'aide sur un script ping
J'ai un nouveau souci ...
Mon script.sh s'execute toutes les minutes, m'envoie un mail s'il y'a une ip qui repond pas, puis m'en renvoie un dans 3h grâce a supprscript.sh.
Jusque là, tout va bien.
Je ne suis cependant pas prévenu par mail si cette ip qui n'était pas joignable l'est de nouveau !
J'ai alors essayé de rajouté cette fonction dans mon script comme ceci :
#!/bin/bash
temps=`date -d 'now' '+%F %T'`
commande= grep -q "$i" $HOME/Documents/Scripts/PingV3/injoignable
for i in $( cat $HOME/Documents/Scripts/PingV3/iplist )
do
ping -q -c1 $i > /dev/null
if [ $? -eq 0 ] && $commande
then
echo $i ": UP" >> $HOME/Documents/Scripts/PingV3/joignable
/usr/sbin/sendmail "mail@mail.fr" < $HOME/Documents/Scripts/PingV3/joignable
sed -i -e /^$i/d $HOME/Documents/Scripts/PingV3/injoignable #Si le switch est up, on le supprime des injoignables
sed -i -e /^$i/d $HOME/Documents/Scripts/PingV3/joignable
elif [ $? -eq 0 ]
then
echo "ok"
elif grep -q "$i" $HOME/Documents/Scripts/PingV3/injoignable # Si l'ip est présente dans le fichier,
then
echo "Ne fais rien."
else
echo $i "depuis :" $temps >> $HOME/Documents/Scripts/PingV3/injoignable
/usr/sbin/sendmail "mail@mail.fr" < $HOME/Documents/Scripts/PingV3/injoignable
fi
done
L'idée, avec la première condition, est que si l'ip est pingable et que cette même ip est dans le fichier injoignable ->
Ca ajoute l'ip dans un fichier joignable
Ca envoie un mail avec l'aide du fichier joignable (qui est comme le fichier injoignable)
Ca supprime l'ip du fichier injoignable et du fichier joignable (sinon, il envoie tout le temps un mail pour me dire qu'il est up !)
Sauf que ça fonctionne pas. Cette condition est tout le temps vraie avec une ip joignable ... J'ai l'impression qu'il ne vérifie pas la seconde condition.
Cette fois c'est un erreur de code...
Dernière modification par arlandria64 (Le 19/08/2018, à 07:35)
Hors ligne
#15 Le 19/08/2018, à 08:25
- diesel
Re : [script/bash] Besoin d'aide sur un script ping
Ben..., ça ressemble surtout à une erreur de conception.
Lorsque ton script se termine, toutes les variables que tu avais définies sont effacées.
A l'exécution suivante, on repart à zéro.
Si tu veux que ton script se souvienne de ce qui s'est passé à l'exécution précédente, il faut que tu stockes le contenu des variables qui t'intéressent dans un fichier.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
En ligne
#16 Le 19/08/2018, à 08:51
- arlandria64
Re : [script/bash] Besoin d'aide sur un script ping
Je ne comprends pas trop.
Exemple :
Premier tour de boucle. IP 192.168.1.1 est pingable ? Oui -> Est-ce qu'elle est dans le fichier injoignable ? Non -> Passage a la seconde condition. 192.168.1.1 est pingable ? Oui -> Ok.
Second tour de boucle. IP 192.168.1.50 est pingable ? Oui -> Est-ce qu'elle est dans le fichier injoignable ? Oui -> Remplissage du fichier "joignable", envoie du mail, suppression de l'ip dans le fichier injoignable et joignable.
Voici ce que je voudrais que ça fasse... Mais je ne vois pas l'erreur.
Les variables $commande et $temps n'ont pas nécessité a être stockées dans des fichiers. $commande était surtout un test.
Je vous avoue que je ne suis pas expert en dev...
Hors ligne
#17 Le 19/08/2018, à 10:34
- lynn
Re : [script/bash] Besoin d'aide sur un script ping
Bonjour,
Il y a moyen de faire plus simple. Pour tester, dans la liste d'ip, j'ai ajouté irctc.co.in et nimbuzz.com qui sont injoingnables actuellement. # Source: http://www.isitdownrightnow.com
#!/bin/bash
iplist="google.com irctc.co.in facebook.com nimbuzz.com wikipedia.org"
email="user@ip"
_date() { date -d "now" "+%F %T"; }
for i in ${iplist[@]}
do
! ping -c1 $i >/dev/null && echo "Le `_date`: $i n'est pas joignable!" | mail -s "IP injoignable" ${email} ;
done
Après, on peut mettre tout ça dans une boucle pour répéter cette opération toutes les X minutes.
Edit: simplification
Dernière modification par lynn (Le 19/08/2018, à 11:01)
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#18 Le 19/08/2018, à 11:02
- diesel
Re : [script/bash] Besoin d'aide sur un script ping
Je ferais plutôt un truc dans le genre :
while read ip
do
if `ping -q -c1 $ip >/dev/null`
then echo $ip >>$HOME/Documents/Scripts/PingV3/joignable.new
else
echo $ip >>$HOME/Documents/Scripts/PingV3/injoignable.new
echo "L'adresse $ip est devenue injoignable" | mail -s "test ping adresse $ip" mail@mail.fr
fi
done < $HOME/Documents/Scripts/PingV3/joignable
while read ip
do
if `ping -q -c1 $ip >/dev/null`
then
echo $ip >>$HOME/Documents/Scripts/PingV3/joignable.new
echo "L'adresse $ip est redevenue joignable" | mail -s "test ping adresse $ip" mail@mail.fr
else echo $ip >>$HOME/Documents/Scripts/PingV3/injoignable.new
fi
done < $HOME/Documents/Scripts/PingV3/injoignable
rm $HOME/Documents/Scripts/PingV3/joignable
rm $HOME/Documents/Scripts/PingV3/injoignable
mv $HOME/Documents/Scripts/PingV3/joignable.new $HOME/Documents/Scripts/PingV3/joignable
mv $HOME/Documents/Scripts/PingV3/injoignable.new $HOME/Documents/Scripts/PingV3/injoignable
exit 0
Et je ne me ferais pas chier avec la date, elle est contenue dans les mails.
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 19/08/2018, à 12:06)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
En ligne
#19 Le 19/08/2018, à 11:14
- lynn
Re : [script/bash] Besoin d'aide sur un script ping
Second tour de boucle. IP 192.168.1.50 est pingable ? Oui -> Est-ce qu'elle est dans le fichier injoignable ? Oui -> Remplissage du fichier "joignable", envoie du mail, suppression de l'ip dans le fichier injoignable et joignable.
192.168.1.50 est pingable ? Oui -> Est-ce qu'elle est dans le fichier injoignable ? Oui
injoignable..? Ne serait-ce pas plutôt joignable dans ce cas..?
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#20 Le 19/08/2018, à 11:53
- lynn
Re : [script/bash] Besoin d'aide sur un script ping
@diesel83140
A part si c'est pour historiser, dans un but statistique par exemple, les serveurs qui peuvent devenir injoignables, je ne vois pas l'intérêt d'écrire dans des fichiers que tu vas supprimer à la fin..?
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#21 Le 19/08/2018, à 12:07
- diesel
Re : [script/bash] Besoin d'aide sur un script ping
@diesel83140
A part si c'est pour historiser, dans un but statistique par exemple, les serveurs qui peuvent devenir injoignables, je ne vois pas l'intérêt d'écrire dans des fichiers que tu vas supprimer à la fin..?
Il serait souhaitable que tu lises le script jusqu'à la fin.
Amicalement.
Jean-Marie
P.S. J'aurais pu écrire directement : "mv $HOME/Documents/Scripts/PingV3/joignable.new $HOME/Documents/Scripts/PingV3/joignable", mais pour la lisibilité du code, j'ai préféré écrire en clair la destruction du fichier de destination avant de changer le nom du fichier nouvellement créé qui le remplace.
Dernière modification par diesel (Le 19/08/2018, à 12:12)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
En ligne
#22 Le 19/08/2018, à 12:25
- lynn
Re : [script/bash] Besoin d'aide sur un script ping
Mon propos n'est pas dans le sens du fonctionnement de ton script mais dans la fonctionnalité de celui. Quel est l'intérêt d'envoyer un mail pour dire qu'un serveur est joignable?
Dans mon exemple, si on suppose que le script lance une vérification toutes les heures, il enverra un courriel seulement si un serveur est injoignable en précisant lequel; Si à la prochaine boucle du script, tu ne recois plus de courriel concernant ce serveur, c'est qu'il redevenu joignable.
«C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!»
Coluche
Hors ligne
#23 Le 19/08/2018, à 12:35
- diesel
Re : [script/bash] Besoin d'aide sur un script ping
Mon propos n'est pas dans le sens du fonctionnement de ton script mais dans la fonctionnalité de celui. Quel est l'intérêt d'envoyer un mail pour dire qu'un serveur est joignable?
Dans mon exemple, si on suppose que le script lance une vérification toutes les heures, il enverra un courriel seulement si un serveur est injoignable en précisant lequel; Si à la prochaine boucle du script, tu ne recois plus de courriel concernant ce serveur, c'est qu'il redevenu joignable.
Ben...,
C'est globalement ce que fait le script que je propose.
Lorsqu'un serveur joignable devient injoignable, il envoie un mail.
Lorsqu'un serveur qui était injoignable depuis... (un certain temps) redevient joignable, il envoie un mail.
Tu veux quoi d'autre ?
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
En ligne
#24 Le 19/08/2018, à 12:56
- diesel
Re : [script/bash] Besoin d'aide sur un script ping
Une version avec des commentaires
#!/bin/bash
###########################################################################################
# Boucle de test des sites joignables lors de la dernière exécution
###########################################################################################
# la boucle while initialise la variable ip avec chacune des valeurs contenues dans le fichier
# $HOME/Documents/Scripts/PingV3/joignable (voir la redirection à la fin de la boucle)
# En fonction des résultats du ping les adresses des serveurs sont stockées dans des fichiers temporaires
# joignable.new et injoignable.new
while read ip
do
if `ping -q -c1 $ip >/dev/null` # Teste le résultat du ping
then echo $ip >>$HOME/Documents/Scripts/PingV3/joignable.new # Si le serveur est joignable, on l'ajoute au fichier temporaire des serveurs joignables"
else
echo $ip >>$HOME/Documents/Scripts/PingV3/injoignable.new # Si le serveur est injoignable, on l'ajoute au fichier temporaire des serveurs injoignables"
echo "L'adresse $ip est devenue injoignable" | mail -s "test ping adresse $ip" mail@mail.fr # et on envoie le mail
fi
done < $HOME/Documents/Scripts/PingV3/joignable # Et on passe au serveur suivant jusqu'à épuisement du fichier des serveurs joignables
###########################################################################################
# La même boucle de test pour les sites injoignables lors de la dernière exécution
###########################################################################################
while read ip
do
if `ping -q -c1 $ip >/dev/null`
then
echo $ip >>$HOME/Documents/Scripts/PingV3/joignable.new
echo "L'adresse $ip est redevenue joignable" | mail -s "test ping adresse $ip" mail@mail.fr # Là, on envoie le mail si le serveur redevient joignable
else echo $ip >>$HOME/Documents/Scripts/PingV3/injoignable.new
fi
done < $HOME/Documents/Scripts/PingV3/injoignable
###########################################################################################
# Nettoyage en vue de la prochaine exécution
###########################################################################################
# Effacement des fichiers issus de la dernière exécution qui ne servent plus à rien
# Juste pour la lisibilité, puisqu'ils auraient été effacés par les commandes mv qui suivent
rm $HOME/Documents/Scripts/PingV3/joignable
rm $HOME/Documents/Scripts/PingV3/injoignable
# On recrée les fichiers joignable et injoignable à partir des fichiers temporaires en vue de la prochaine exécution
mv $HOME/Documents/Scripts/PingV3/joignable.new $HOME/Documents/Scripts/PingV3/joignable
mv $HOME/Documents/Scripts/PingV3/injoignable.new $HOME/Documents/Scripts/PingV3/injoignable
exit 0 # Fin du script
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 19/08/2018, à 13:10)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
En ligne
#25 Le 19/08/2018, à 15:11
- Watael
Re : [script/bash] Besoin d'aide sur un script ping
if `ping -q -c1 $ip >/dev/null`
je n'en lirai pas plus.
if ping -c1 "$ip" &>/dev/null
!
pas besoin de Substitution de commande.
edit: ajout d'un chevron oublié.
Dernière modification par Watael (Le 20/08/2018, à 11:22)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne