Introduction
ping est l’une des commandes de dépannage réseau les plus populaire. Elle affiche le temps d’aller retour (round trip time) mais n’affiche pas d’horodatage (timestamp).
Dans ce tutoriel, nous allons montrer comment afficher un horodatage pour chaque message envoyé par ping.
Fonctionnement par défaut
Commençons pas pinger localhost
$ ping -c 4 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.045 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.050 ms
64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.050 ms
--- localhost ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3139ms
rtt min/avg/max/mdev = 0.029/0.043/0.050/0.010 ms
On envoie 4 messages ICMP Echo Request en utilisant l’option -c de ping. En conséquence, on reçoit les messages ICMP Echo Reply avec succès. Le RTT est affiché à la fin de la ligne. Néanmoins, aucun timestamp n’est affiché.
Pourtant, dans le cadre de dépannages, il peut être nécessaire d’afficher le timestamp des messages ping. Dans les sections suivantes, voyons comment ajouter le timestamp.
Utiliser l’option -D de ping et awk
On peut utiliser l’option -D de ping pour afficher le timestamp.
$ ping -D -c 4 localhost
PING localhost (127.0.0.1) 56(84) bytes of data.
[1726494959.977368] 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.030 ms
[1726494961.050111] 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.023 ms
[1726494962.090149] 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.043 ms
[1726494963.130538] 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.050 ms
--- localhost ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3153ms
rtt min/avg/max/mdev = 0.023/0.036/0.050/0.012 ms
Le timestamp est affiché entre crochets au début de chaque message ping. Néanmoins, il est affiché au format epoch. Par exemple, le temps epoch pour le premier ping est 1726494959.977368. Il est possible de convertir ce format epoch en un format facilement lisible à l’aide d’outils en ligne :
On peut utiliser l’utilitaire awk pour convertir le format epoch en format lisible par un humain.
$ ping -D -c 4 localhost | awk '{if(gsub(/\[|\]/, "", $1)) {$1= strftime("[%F %T]", $1); print} else print }'
PING localhost (127.0.0.1) 56(84) bytes of data.
[2024-09-16 16:00:21] 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.022 ms
[2024-09-16 16:00:23] 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.043 ms
[2024-09-16 16:00:24] 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.060 ms
[2024-09-16 16:00:25] 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.039 ms
--- localhost ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3142ms
rtt min/avg/max/mdev = 0.022/0.041/0.060/0.013 ms
Les timestamp sont ainsi lisibles facilement.
On envoie la sortie de la commande ping -D -c 4 localhost à awk en utilisant un pipe (|). Voici la partie awk écrite de manière plus lisible
if(gsub(/\[|\]/, "", $1)) {
$1= strftime("[%F %T]", $1);
print
}
else
print
Nous essayons de substituer les crochets ouvrants et fermants du premier champ avec une chaîne de caractère vide en utilisant gsub(/\[|\]/, “”, $1). La fonction gsub de awk retourne le nombre de substitutions réalisées.
Dans le cas d’une substitution effectuée avec succès, la condition du if devient vraie. Ensuite, nous formation le format epoch en utilisant la fonction strftime() de awk. La chaîne de charactère “[%F %T]“ indique comment le format epoch doit être formaté. Le sélecteur %F et équivalent à %Y-%m-%d. De manière similaire, le sélecteur %T est équivalent à %H-%M-%S. Les paramètres qui peuvent être utilisés sont indiqués ici.
Après avoir formaté la date, elle est affichée avec la commande print.
Si la substitution a échoué (pour la première ligne PING localhost (127.0.0.1) 56(84) bytes of data par exemple), on affiche juste la ligne, sans rien ajouter au début.
Utiliser date
Une autre manière d’ajouter les timestamp à la sortie de ping est d’utiliser la commande date.
$ ping -c 4 localhost | while read result; do echo "[$(date)] $result";done
[Mon Sep 16 16:17:16 CEST 2024] PING localhost (127.0.0.1) 56(84) bytes of data.
[Mon Sep 16 16:17:16 CEST 2024] 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.034 ms
[Mon Sep 16 16:17:17 CEST 2024] 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.038 ms
[Mon Sep 16 16:17:18 CEST 2024] 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.042 ms
[Mon Sep 16 16:17:19 CEST 2024] 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.049 ms
[Mon Sep 16 16:17:19 CEST 2024]
[Mon Sep 16 16:17:19 CEST 2024] --- localhost ping statistics ---
[Mon Sep 16 16:17:19 CEST 2024] 4 packets transmitted, 4 received, 0% packet loss, time 3112ms
[Mon Sep 16 16:17:19 CEST 2024] rtt min/avg/max/mdev = 0.034/0.040/0.049/0.009 ms
Ainsi, la date et l’heure sont ajoutés. Néanmoins, l’horodatage est ajouté à chaque ligne.
Pour commencer, on passe chaque ligne de la sortie de la commande ping -c 4 localhost à une boucle while en utilisant un pipe (|). Ensuite, on stocke chaque ligne dans une variable result en utilisant la commande read dans la séquence while read result. Finalement, on ajouter le résultat de la commande date au contenu de la variable result et on affiche tout en utilisant echo “[$(date)] $result”.
Utiliser ts
La command ts est une autre possibilité pour ajouter des timestamp. Elle est disponible dans le package moreutils.
Il faut passer le résultat de la commande ping à ts en utilisant un pipe :
$ ping -c 4 localhost | ts
Sep 16 16:30:47 PING localhost (127.0.0.1) 56(84) bytes of data.
Sep 16 16:30:47 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.111 ms
Sep 16 16:30:48 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.043 ms
Sep 16 16:30:50 64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.026 ms
Sep 16 16:30:51 64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.069 ms
Sep 16 16:30:51
Sep 16 16:30:51 --- localhost ping statistics ---
Sep 16 16:30:51 4 packets transmitted, 4 received, 0% packet loss, time 3092ms
Sep 16 16:30:51 rtt min/avg/max/mdev = 0.026/0.062/0.111/0.032 ms
On a ajouté le timestamp avec succès. Néanmoins, l’horodatage est également ajouté à chaque ligne, comme avec la méthode précédente.
Conclusion
Dans cet article, nous avons vu comment ajouter de l’horodatage au résultat de la commande ping.
Après avoir vu le comportement par défaut de ping, on a vu comment ajouter des timestamp avec l’option -D de ping. Cependant, comme l’option -D affiche le timestamp au format epoch, nous avons converti ce format en format humainement lisible en utilisant la fonction strftime() de awk.
Ensuite, nous avons utiliser la commande date dans une boucle while afin d’ajouter le timestamp au résultat de la commande ping.
Finalement, nous avons vu qu’il est aussi possible d’utiliser la commande ts, qui est disponible dans certaines distributions Linux.