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

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.

Hors 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.

Hors 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.

Hors ligne

#19 Le 19/08/2018, à 11:14

lynn

Re : [script/bash] Besoin d'aide sur un script ping

arlandria64 a écrit :

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

lynn a écrit :

@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.

Hors 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

lynn a écrit :

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. cool

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.

Hors 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.

Hors 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