Script ping pour récupérer résultats


#1

Hello à toutes et tous.
Pour un projet perso,
j’ai besoin de faire un script qui va pinguer google et orange, puis enregistrer les résultats.

voici mon petit script :

#!/bin/bash

echo "ping orange"
ping 8.8.8.8 -c5 >> /doudou/tmp/google.ping

echo "Ping google"
ping www.orange.fr -c5 >> /doudou/tmp/orange.ping

echo "traitement resultats"
#resultats google
echo "[ping google]" >>/doudou/tmp/resultats
grep icmp_seq=1 /doudou/tmp/google.ping >>/doudou/tmp/resultats
grep icmp_seq=2 /doudou/tmp/google.ping >>/doudou/tmp/resultats
grep icmp_seq=3 /doudou/tmp/google.ping >>/doudou/tmp/resultats
grep icmp_seq=4 /doudou/tmp/google.ping >>/doudou/tmp/resultats
grep icmp_seq=5 /doudou/tmp/google.ping >>/doudou/tmp/resultats

#resultats orange
echo "[ping orange]" >>/doudou/tmp/resultats
grep icmp_seq=1 /doudou/tmp/orange.ping >>/doudou/tmp/resultats
grep icmp_seq=2 /doudou/tmp/orange.ping >>/doudou/tmp/resultats
grep icmp_seq=3 /doudou/tmp/orange.ping >>/doudou/tmp/resultats
grep icmp_seq=4 /doudou/tmp/orange.ping >>/doudou/tmp/resultats
grep icmp_seq=5 /doudou/tmp/orange.ping >>/doudou/tmp/resultats

Et voici ce qui en ressort :
[ping google]
64 bytes from 8.8.8.8: icmp_seq=1 ttl=128 time=6.38 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=128 time=7.09 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=128 time=7.22 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=128 time=7.97 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=128 time=7.20 ms
[ping orange]
64 bytes from vip1.dyn.hpo.s1.fti.net (193.252.148.241): icmp_seq=1 ttl=128 time=16.9 ms
64 bytes from vip1.dyn.hpo.s1.fti.net (193.252.148.241): icmp_seq=2 ttl=128 time=16.4 ms
64 bytes from vip1.dyn.hpo.s1.fti.net (193.252.148.241): icmp_seq=3 ttl=128 time=16.1 ms
64 bytes from vip1.dyn.hpo.s1.fti.net (193.252.148.241): icmp_seq=4 ttl=128 time=16.9 ms
64 bytes from vip1.dyn.hpo.s1.fti.net (193.252.148.241): icmp_seq=5 ttl=128 time=16.6 ms

J’aimerais simplifier les lignes et au lieu d’avoir
“64 bytes from vip1.dyn.hpo.s1.fti.net (193.252.148.241): icmp_seq=5 ttl=128 time=16.6 ms”
avoir que le temps soit
“time1=16.9ms”, time2=16.4ms" etc…

Quelqu’un pourrait m’aider :slight_smile: ?


#2

Bonjour

#!/bin/bash

fichSortie="/doudou/tmp/resultats"
maRegex='.* time=(.*)'

lancePing() {
    compteur=0
    lignePing=""
    while read; do
        [[ $REPLY =~ $maRegex ]] && \
        {
            compteur=$(($compteur+1))
            lignePing="$lignePing time$compteur=${BASH_REMATCH[1]},"
        }
    done <<< $(ping -c5 $2)
    printf '%s\n' "[$1]${lignePing:0:-1}" >> "$3"
}

lancePing "Ping google" 8.8.8.8       "$fichSortie"
lancePing "Ping orange" www.orange.fr "$fichSortie"

Le contenu de /doudou/tmp/resultats sera :

[Ping google] time1=17.6 ms, time2=17.3 ms, time3=17.5 ms, time4=17.7 ms, time5=17.7 ms
[Ping orange] time1=17.8 ms, time2=18.3 ms, time3=18.4 ms, time4=18.3 ms, time5=18.0 ms

#3

Hello
Merci pour ta réponse.
et ton script qui est génial.
Je vais l’analyser pour le comprendre, va me falloir des jours je pense lol.
J’aime bien comprendre ce qu’on me propose :).
Petite question :
Peut on éditer les résultats de ce type :

[Ping Google]
time1=
time2=

En tout cas merci encore pour ton aide.


#4

Celui là devrait mieux correspondre au résultat que tu cherches à obtenir :

#!/bin/bash

fichSortie="/doudou/tmp/resultats"      # Assigner un nom de fichier à la variable fichSortie
maRegex='.* time(=.*)'                  # Tout ce qui suit " time" jusqu'à la fin de la ligne

# Création d'une fonction nommée "lancePing"
lancePing() {
    compteur=0                          # Initialiser le compteur à "0"
    printf '%s\n' "[$1]" >> "$3"        # Envoyer dans le fichier de sortie une ligne contenant le premier paramètre entre crochets
    while read; do
        [[ $REPLY =~ $maRegex ]] && \
        {
            compteur=$(($compteur+1))   # Incrémenter le compteur
            printf '%s\n' "time$compteur${BASH_REMATCH[1]/ /}" >> "$fichSortie"
        }
    done <<< $(ping -c5 $2)             # Rediriger la sortie de la commande ping vers l'entrée de la boucle while
}
# Fin de la définition de la fonction "lancePing"

lancePing "Ping Google" 8.8.8.8       "$fichSortie"  # Lancer la fonction lancePing avec 3 paramètres
lancePing "Ping Orange" www.orange.fr "$fichSortie"  # Lancer la fonction lancePing avec 3 autres paramètres

Il donne :

[Ping Google]
time1=17.5ms
time2=17.3ms
time3=19.1ms
time4=17.5ms
time5=21.6ms
[Ping Orange]
time1=17.7ms
time2=18.1ms
time3=18.2ms
time4=18.3ms
time5=18.2ms

=======

michel@debg53sw:~$ machaine="bla bla et autre … time=123456 jusqu'à la fin de la ligne"
michel@debg53sw:~$ maRegex='.* time(=.*)'

michel@debg53sw:~$ [[ $machaine =~ $maRegex ]] && echo ${BASH_REMATCH[1]}
=123456 jusqu'à la fin de la ligne

michel@debg53sw:~$ [[ $machaine =~ $maRegex ]] && echo ${BASH_REMATCH[1]/ /}
=123456jusqu'à la fin de la ligne

michel@debg53sw:~$ [[ $machaine =~ $maRegex ]] && echo ${BASH_REMATCH[1]// /}
=123456jusqu'àlafindelaligne

michel@debg53sw:~$ [[ $machaine =~ $maRegex ]] && echo "du texte ajouté juste avant${BASH_REMATCH[1]// /}"
du texte ajouté juste avant=123456jusqu'àlafindelaligne

Si aucun nom de variable n’est fourni à la fonction read (de l’interpréteur de commande bash)
cette fonction créé automatiquement une variable nommée REPLY
à laquelle cette fonction assignera pour valeur chaque ligne lue
qui, dans ce script, provient de la sortie de la commande ping

Voir le retour de la commande :

man --pager="less -p '   read '" bash

#5

Je te remercie, au top ton script. Et merci également pour les explications :slight_smile:


#6

Hello encore moi :slight_smile:

Désole de t’embeter encore, mais j’ai un petit soucis.

Sous Stretch, ton script passe nickel.

Par contre sous Jessie, voici ce qui en sort :

Ping Google]
time1=5.13ms --- 8.8.8.8 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 5.134/5.267/5.409/0.140 ms
[Ping Orange]
time1=15.2ms --- d.hpc.gtm.fti.net ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 15.276/15.317/15.341/0.145 ms

Pas de message d’erreur. :frowning:


#7

Effectivement, je viens de constater le problème sous debian 8 (jessie)

J’ai donc reformulé le script de cette façon :

#!/bin/bash

fichSortie="/doudou/tmp/resultats"      # Assigner un nom de fichier à la variable fichSortie
maRegex='.* time(=.*)'                  # Tout ce qui suit " time" jusqu'à la fin de la ligne

# Création d'une fonction nommée "lancePing"
lancePing() {
    compteur=0                          # Initialiser le compteur à "0"
    printf '%s\n' "[$1]" >> "$3"        # Envoyer dans le fichier de sortie une ligne contenant le premier paramètre entre crochets
    while IFS= read; do
        [[ $REPLY =~ $maRegex ]] && \
        {
            compteur=$(($compteur+1))   # Incrémenter le compteur
            printf '%s\n' "time$compteur${BASH_REMATCH[1]/ /}" >> "$fichSortie"
        }
    done < <(ping -c5 $2)               # Rediriger la sortie de la commande ping vers l'entrée de la boucle while
}
# Fin de la définition de la fonction "lancePing"

lancePing "Ping Google" 8.8.8.8       "$fichSortie"  # Lancer la fonction lancePing avec 3 paramètres
lancePing "Ping Orange" www.orange.fr "$fichSortie"  # Lancer la fonction lancePing avec 3 autres paramètres

Le script ci-dessus fonctionne correctement sous debian 8 (jessie) et debian 9 (stretch)


#8

Merci beaucoup, c’est fonctionnel au top :slight_smile:


#9

Merci pour le retour :grinning:


#10

regarde fping, il fera certainement directement ce que tu demande