# [Bash] Vérifier la validité d'une adresse IP et MAC (Résolu)

## BaNaNe

Bonjour!

Ce sujet n'est pas directement lié à Gentoo mais je sais qu'il y a plein de programmeurs fous ici et que j'ai donc beaucoup de chances d'obtenir une réponse  :Wink: 

Je suis en train de faire un petit script qui doit ajouter des entrées dans les fichier /etc/ethers et /etc/hosts. Le but étant de pouvoir ajouter facilement des entrées dans ces fichiers pour que dnsmasq les prennent en compte.

Mon script fonctionne mais je voudrais qu'il vérifie aussi qu'on ne lui donne pas n'importe quoi en paramètre. Il faut donc qu'il vérifie que le paramètre "ip" et "mac" soient correctes. 

Je débute en bash et en regexp, soyez donc indulgents  :Wink: 

En gros, en cherchant sur le net, j'ai trouvé ces deux regexp : 

IP : 

```
((?:2[0-5]{2})|(?:1?\d\d?))\.((?:2[0-5]{2})|(?:1?\d\d?))\.((?:2[0-5]{2})|(?:1?\d\d?))\.((?:2[0-5]{2})|(?:1?\d\d?))
```

MAC : 

```
^([a-zA-Z0-9]{2})-([a-zA-Z0-9]{2})-([a-zA-Z0-9]{2})-([a-zA-Z0-9]{2})-([a-zA-Z0-9]{2})-([a-zA-Z0-9]{2})$
```

Ensuite, j'ai essayé de trouver comment les intégrer dans un script bash. J'ai trouvé quelque chose dans le style : 

```
if [[ "$MyString" =~ "<<uneRegex>>" ]]; then

         <<faire qqch>>

else

         <<faire autre chose>>

fi
```

Le problème est que, avec les deux regexp ci-dessus, je tombe toujours dans le else... même si l'adresse ip ou mac donnée en paramètre est correcte.

Est-ce que je m'y prend mal? Ou ce sont les regexp qui sont fausses?

Est-ce qu'un gourou du bash et des regexp pourrait m'aider?

Merci beaucoup!

----------

## Zazbar

Hum,

pourquoi pas faire ca en perl ?

ta condition donnerait un truc du genre :

```

if ( $MyString =~ /ta_regex/) {

         <<faire qqch>>

}else{

         <<faire autre chose>>

}

```

En bash je fais pas trop de truc de ce genre ....dsl

Voila mes 0,2 cents

EDIT : si tu vires les guillements autour de $MyString, ca marche pas mieux ?

----------

## BaNaNe

Ah tiens, j'avais dû faire une fausse manuvre. Pour le test de l'adresse MAC, ca fonctionne. J'ai juste modifié la regexp du premier post pour n'accepter que les lettres de A à F et non de A à Z...

Par contre, pour l'IP, rien à faire, je tombe toujours dans le else :s

Alors, pourquoi ne pas le faire en Perl? C'est simple, je ne connais pas le Perl... j'avais déjà quelques bases en Bash, c'est pourquoi je me suis tourné vers ce langage. Et puisque ce que je veux faire est sensé être possible en bash, je préfère continuer en bash  :Wink: 

Merci pour ton aide!

----------

## Zazbar

Ta regex est peut etre mauvaise ....

J'avais fais ca pour un prog a une époque  (en java )

String _255 = "(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"; // REGEX (<255)

String ip = "(?:"+_255+"\\.){0,3}(?:"+_255+"){0,1}"; //REGEX IP(127.0.0.1)

En bash ca te donnera un truc du genre (si j'ai pas de fautes de copier/coller)

```

(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){0,3}(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){0,1}

```

Voila  :Smile: 

----------

## truc

je ne saispas si bash comprend les trucs du style \d

T'as essayé en les remplaçant par [0-9] ?

----------

## BaNaNe

Alors, j'ai essayé en remplaçant les \d par des [0-9] mais... ca va toujours pas :s

J'ai aussi essayé la regexp de Zazbar mais... va pas non plus :s

Il faudrait peut-être que je tente d'apprendre les regexp mais ce n'est pas ce qui m'intéresse le plus dans mon projet...

Je vous donne le code complet, vous trouverez peut-être une incohérence   :Rolling Eyes: 

```

#Verifier la validite de l'adresse

if [[ $1 =~ "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){0,3}(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){0,1}" ]]; then

           IP="$1"

else

           echo L\'adresse IP entree n\'est pas valide : $1

           exit -1

fi

```

Et donc, si $1 contient un truc comme 789.745.999.451, je tombe bien dans le else mais si il contient 10.59.13.2, je tombe aussi dans le else !

Voilà, merci beaucoup!

----------

## Zazbar

oups, j'ai du oublier un "\" :

```

(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){0,3}(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){0,1} 

```

----------

## truc

Puisque les regex te rebutent, faisons le autrement (cela dit te devrais quand même t'y interesser, c'est vraiment pratique!)

```
#!/bin/sh

nb=1

error=0

for i in ${1//./ }

do

   echo $nb

   if [ $i -gt 255 -o $nb -gt 4 ]; then

      error=1

      break

   fi

   let nb+=1

done

[[ $error -gt 0 ]] && echo error || echo youhou
```

Normalement c'est bon, après t'en fait une fonction, ce que tu veux quoi  :Razz: 

Je suppose qu'on peut facilement faire quelque chose de similaire pour les adresse MAC

----------

## BaNaNe

Désolé Zazbar mais ça ne fonctionne toujours pas :s Je ne sais pas si c'est moi qui m'y prend mal?

Par contre, la fonction de truc fonctionne et je crois que je vais m'en contenter pour le moment. Mais c'est vrai que les expressions régulières ont l'air de permettre de faire plein de choses, il faudra que je m'y intéresse un de ces 4  :Wink: 

En tout cas, merci beaucoup à vous tous!

----------

## Zazbar

 *BaNaNe wrote:*   

> Désolé Zazbar mais ça ne fonctionne toujours pas :s Je ne sais pas si c'est moi qui m'y prend mal?
> 
> Par contre, la fonction de truc fonctionne et je crois que je vais m'en contenter pour le moment. Mais c'est vrai que les expressions régulières ont l'air de permettre de faire plein de choses, il faudra que je m'y intéresse un de ces 4 
> 
> En tout cas, merci beaucoup à vous tous!

 

Le principal c'est que tu ais trouvé une solution a ton problème !

A+

----------

## truc

Par conter tu dois bien garder le echo youhou dans ta version finale, sinon le code risque de marcher moins bien  :Razz: 

----------

## BaNaNe

Bien entendu, c'est ce echo qui fait que tout fonctionne :p

Blague à part, voici le code transformé en fonction que j'ai utilisé, si ça peut servir à quelqu'un...  :Wink: 

```

function verifIP

{

        nb=1

        error=0

        for i in ${1//./ }

        do

                if [ $i -gt 255 -o $nb -gt 4  ]; then

                        error=1

                        return -1

                fi

                let nb+=1

        done

        return 0

}

```

Si la valeur de retour de la fonction est -1, l'IP est incorrecte, si elle est 0, c'est ok. Il faut bien entendu lui passer la chaine contenant l'adresse IP en paramètre.

----------

## truc

bah si on veut pousser le vice, y'aurait d'autres tests à faire:

est ce que l'adresse que tu prends en argument, est forcément du style A.B.C.D ?

Car si ça n'est pas le cas, faudrait vérifier qu'il n'y a que des chiffres, que nb soit bien égal à 4 en sortant de la boucle, et.... que en plus d'être <=255 il faudrait également qu'ils soient >= 0

et après ça j'pense que ça devrait être bon

EDIT: au fait, tu peux jarter la variable error, puisque tu ne t'en sers plus  :Smile: 

----------

