Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[Bash] Vérifier la validité d'une adresse IP et MAC (Résolu)
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
BaNaNe
Guru
Guru


Joined: 18 May 2003
Posts: 327
Location: Vous êtes ici...

PostPosted: Fri Jul 06, 2007 10:51 am    Post subject: [Bash] Vérifier la validité d'une adresse IP et MAC (Réso Reply with quote

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 ;)

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 ;)

En gros, en cherchant sur le net, j'ai trouvé ces deux regexp :
IP :
Code:
((?: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 :
Code:
^([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 :
Code:
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!
_________________
Comme c'est à la mode de mettre la config de tous ses pc...
Desktop : Intel Q9550 + 4Go DDR2 + 640Go & 1To Sata2 + HD4870
Portable : Centrino 2ghz 1Go DDR 160GO
Server Fichier : PII 400Mhz 640SDR 200GO


Last edited by BaNaNe on Fri Jul 06, 2007 2:50 pm; edited 1 time in total
Back to top
View user's profile Send private message
Zazbar
Apprentice
Apprentice


Joined: 26 Jul 2005
Posts: 279
Location: Paris Time

PostPosted: Fri Jul 06, 2007 11:29 am    Post subject: Reply with quote

Hum,

pourquoi pas faire ca en perl ?
ta condition donnerait un truc du genre :

Code:

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 ?
_________________
Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et montrer qu'on l'est. -- P. Dac - Pensées
Back to top
View user's profile Send private message
BaNaNe
Guru
Guru


Joined: 18 May 2003
Posts: 327
Location: Vous êtes ici...

PostPosted: Fri Jul 06, 2007 11:43 am    Post subject: Reply with quote

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 ;)

Merci pour ton aide!
_________________
Comme c'est à la mode de mettre la config de tous ses pc...
Desktop : Intel Q9550 + 4Go DDR2 + 640Go & 1To Sata2 + HD4870
Portable : Centrino 2ghz 1Go DDR 160GO
Server Fichier : PII 400Mhz 640SDR 200GO
Back to top
View user's profile Send private message
Zazbar
Apprentice
Apprentice


Joined: 26 Jul 2005
Posts: 279
Location: Paris Time

PostPosted: Fri Jul 06, 2007 12:17 pm    Post subject: Reply with quote

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)
Code:

(?:(?: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 :)
_________________
Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et montrer qu'on l'est. -- P. Dac - Pensées
Back to top
View user's profile Send private message
truc
Advocate
Advocate


Joined: 25 Jul 2005
Posts: 3199

PostPosted: Fri Jul 06, 2007 12:18 pm    Post subject: Reply with quote

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

T'as essayé en les remplaçant par [0-9] ?
_________________
The End of the Internet!
Back to top
View user's profile Send private message
BaNaNe
Guru
Guru


Joined: 18 May 2003
Posts: 327
Location: Vous êtes ici...

PostPosted: Fri Jul 06, 2007 12:35 pm    Post subject: Reply with quote

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 :roll:

Code:

#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!
_________________
Comme c'est à la mode de mettre la config de tous ses pc...
Desktop : Intel Q9550 + 4Go DDR2 + 640Go & 1To Sata2 + HD4870
Portable : Centrino 2ghz 1Go DDR 160GO
Server Fichier : PII 400Mhz 640SDR 200GO
Back to top
View user's profile Send private message
Zazbar
Apprentice
Apprentice


Joined: 26 Jul 2005
Posts: 279
Location: Paris Time

PostPosted: Fri Jul 06, 2007 12:42 pm    Post subject: Reply with quote

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

(?:(?: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}

_________________
Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et montrer qu'on l'est. -- P. Dac - Pensées
Back to top
View user's profile Send private message
truc
Advocate
Advocate


Joined: 25 Jul 2005
Posts: 3199

PostPosted: Fri Jul 06, 2007 1:01 pm    Post subject: Reply with quote

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

Code:
#!/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 :P

Je suppose qu'on peut facilement faire quelque chose de similaire pour les adresse MAC
_________________
The End of the Internet!
Back to top
View user's profile Send private message
BaNaNe
Guru
Guru


Joined: 18 May 2003
Posts: 327
Location: Vous êtes ici...

PostPosted: Fri Jul 06, 2007 2:49 pm    Post subject: Reply with quote

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!
_________________
Comme c'est à la mode de mettre la config de tous ses pc...
Desktop : Intel Q9550 + 4Go DDR2 + 640Go & 1To Sata2 + HD4870
Portable : Centrino 2ghz 1Go DDR 160GO
Server Fichier : PII 400Mhz 640SDR 200GO
Back to top
View user's profile Send private message
Zazbar
Apprentice
Apprentice


Joined: 26 Jul 2005
Posts: 279
Location: Paris Time

PostPosted: Fri Jul 06, 2007 3:00 pm    Post subject: Reply with quote

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+
_________________
Mieux vaut fermer sa gueule et passer pour un con que l'ouvrir et montrer qu'on l'est. -- P. Dac - Pensées
Back to top
View user's profile Send private message
truc
Advocate
Advocate


Joined: 25 Jul 2005
Posts: 3199

PostPosted: Fri Jul 06, 2007 3:50 pm    Post subject: Reply with quote

Par conter tu dois bien garder le echo youhou dans ta version finale, sinon le code risque de marcher moins bien :P
_________________
The End of the Internet!
Back to top
View user's profile Send private message
BaNaNe
Guru
Guru


Joined: 18 May 2003
Posts: 327
Location: Vous êtes ici...

PostPosted: Fri Jul 06, 2007 10:49 pm    Post subject: Reply with quote

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... ;)

Code:

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.
_________________
Comme c'est à la mode de mettre la config de tous ses pc...
Desktop : Intel Q9550 + 4Go DDR2 + 640Go & 1To Sata2 + HD4870
Portable : Centrino 2ghz 1Go DDR 160GO
Server Fichier : PII 400Mhz 640SDR 200GO
Back to top
View user's profile Send private message
truc
Advocate
Advocate


Joined: 25 Jul 2005
Posts: 3199

PostPosted: Sat Jul 07, 2007 7:22 am    Post subject: Reply with quote

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 :)
_________________
The End of the Internet!
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum