Pour embellir son bureau on utilise souvent un script conky qui permet d’afficher certaines informations de l’état de son système. L’une des informations qu l’on retrouve souvent est l’affichage de son adresse IP du réseau privé (LAN) et celle du réseau publique ou internet (WAN). Dans la majorité des cas, les exemples proposent d’utiliser

    curl ifconfig.me

Quand on utilise une Livebox fournie par Orange, cette information est disponible sur la page d’accueil de la box à l’adresse

    http://<adresse IP de la Livebox>/

Pourquoi donc envoyer une requête sur le web alors que l’information est déja présente dans le réseau local ?

Dans cet article, 2 commandes pour lire cette adresse IP directement sur sa Livebox.

Lire la page d’information

Pour accéder à l’adresse IP, on peut accéder à la Livebox directement depuis son navigateur préféré, mais cette méthode ne permettra pas d’inclure l’adresse dans le résultat d’un script conky.
Pour recopier la page d’accueil de la Livebox sur son PC et la traiter, on peut utiliser la commande

    wget http://<adresse IP de la Livebox>

Cette commande copiera le fichier index.hml dans le répertoire courant et il contiendra l’information recherchée, mais cette information est située au milieu des 543 lignes du fichier :

     yvon@nanda [13:58:23] ~/temp 
     $  wc index.html 
      543  1117 17092 index.html

Pour retrouver l’information, il faut chercher la chaine WAN, l’adresse IP publique se trouve dans le ligne suivante :

    <td class="libelle">Adresse IP WAN :</td>
    <td class="value">A.B.C.D</td>

Pour exploiter plus facilement le contenu du fichier index.html, il faut utiliser la commande curl qui va afficher le contenu du fichier au lieu de la copier en local, le résultat devra être redirigé pour être traité.

Pour traiter le contenu de ce fichier, plusieurs solutions sont possibles, en voici quelques unes.

Avec la commande awk

En utilisant la commande awk, on peut réaliser le traitement de la manière suivante :

    curl 192.168.1.1 | awk '/WAN/{getline;split($2,Addr,">");split(Addr[2],AddIp,"<");print "\n\n"AddIp[1]"\n\n"}'

Avec

  • 192.168.1.1 étant l’adresse IP locale de ma Livebox
  • `/WAN/** : est la chaine recherchée
  • getline pour lire la ligne suivante, celle contenant l’adresse IP
  • split(\$2,Addr,">") va éclater le deuxième paragraphe ($2) de la ligne lue, le résultat sera dans le tableau Addr et le caractère permettant de délimiter les champ sera “>”. Chacun des éléments sera accessible par les variables Addr[1], Addr[2], Addr[3], …
  • split(Addr[2],AddIp,">") va éclaté le contenu du 2ieme élément du tableau Addr, le délimiteur sera “>”

Au final, on obtient :

     yvon@nanda [14:27:45] ~/temp 
     $  curl 192.168.1.1 | awk '/WAN/{getline;split($2,Addr,">");split(Addr[2],AddIp,"<");print "\n\n"AddIp[1]"\n\n"}'
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

    A.B.C.D


    100 17092    0 17092    0     0  91402      0 --:--:-- --:--:-- --:--:-- 92389

     yvon@nanda [14:27:51] ~/temp 

Avec les commandes grep, tail et cut

La commande grep permet de rechercher une chaine de caractère dans un fichier, on peut donc retrouver la chaine WAN :

     yvon@nanda [14:48:01] ~/temp 
     $  grep WAN index.html 
                     <td class="libelle">Adresse IP WAN :</td>

     yvon@nanda [14:51:02] ~/temp 

Pour lire l’adresse IP publique, il faut utiliser l’option -A (after) qui permet de lire les lignes suivant celle contenant le motif recherché :

     $  grep -A 1 WAN index.html 
                        <td class="libelle">Adresse IP WAN :</td>
                     <td class="value">A.B.C.D</td>

     yvon@nanda [14:52:21] ~/temp 

Pour ne garder que la ligne contenant l’adresse IP, on peut utiliser la commande tail :

     yvon@nanda [14:53:45] ~/temp 
     $  grep -A 1 WAN index.html | tail -1
                       <td class="value">A.B.C.D</td>

     yvon@nanda [14:53:52] ~/temp 

Maintenant que l’on a la ligne contenant l’adresse IP, on va utiliser la commande cut avec les options permettant d’afficher des champs et de fixer les délimiteurs :

     yvon@nanda [14:55:43] ~/temp 
     $  grep -A 1 WAN index.html | tail -1 | cut -f2 -d">" | cut -f1 -d"<"
    A.B.C.D

     yvon@nanda [14:55:49] ~/temp 

En lisant le fichier avec curl et en redirigeant le résultat pour un traitement immédiat :

    yvon@nanda [15:31:32] ~/temp 
     $  curl 192.168.1.1 | grep -A 1 WAN index.html | tail -1 | cut -f2 -d">" | cut -f1 -d"<"
    A.B.C.D
     % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
     Dload  Upload   Total   Spent    Left  Speed
     0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
     yvon@nanda [15:31:37] ~/temp