View previous topic :: View next topic |
Author |
Message |
BaNaNe Guru
Joined: 18 May 2003 Posts: 327 Location: Vous êtes ici...
|
Posted: Fri Jul 06, 2007 10:51 am Post subject: [Bash] Vérifier la validité d'une adresse IP et MAC (Réso |
|
|
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 |
|
|
Zazbar Apprentice
Joined: 26 Jul 2005 Posts: 279 Location: Paris Time
|
Posted: Fri Jul 06, 2007 11:29 am Post subject: |
|
|
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 |
|
|
BaNaNe Guru
Joined: 18 May 2003 Posts: 327 Location: Vous êtes ici...
|
Posted: Fri Jul 06, 2007 11:43 am Post subject: |
|
|
Ah tiens, j'avais dû faire une fausse manuvre. 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 |
|
|
Zazbar Apprentice
Joined: 26 Jul 2005 Posts: 279 Location: Paris Time
|
Posted: Fri Jul 06, 2007 12:17 pm Post subject: |
|
|
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 |
|
|
truc Advocate
Joined: 25 Jul 2005 Posts: 3199
|
Posted: Fri Jul 06, 2007 12:18 pm Post subject: |
|
|
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 |
|
|
BaNaNe Guru
Joined: 18 May 2003 Posts: 327 Location: Vous êtes ici...
|
Posted: Fri Jul 06, 2007 12:35 pm Post subject: |
|
|
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
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 |
|
|
Zazbar Apprentice
Joined: 26 Jul 2005 Posts: 279 Location: Paris Time
|
Posted: Fri Jul 06, 2007 12:42 pm Post subject: |
|
|
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 |
|
|
truc Advocate
Joined: 25 Jul 2005 Posts: 3199
|
Posted: Fri Jul 06, 2007 1:01 pm Post subject: |
|
|
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
Je suppose qu'on peut facilement faire quelque chose de similaire pour les adresse MAC _________________ The End of the Internet! |
|
Back to top |
|
|
BaNaNe Guru
Joined: 18 May 2003 Posts: 327 Location: Vous êtes ici...
|
Posted: Fri Jul 06, 2007 2:49 pm Post subject: |
|
|
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 |
|
|
Zazbar Apprentice
Joined: 26 Jul 2005 Posts: 279 Location: Paris Time
|
Posted: Fri Jul 06, 2007 3:00 pm Post subject: |
|
|
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 |
|
|
truc Advocate
Joined: 25 Jul 2005 Posts: 3199
|
Posted: Fri Jul 06, 2007 3:50 pm Post subject: |
|
|
Par conter tu dois bien garder le echo youhou dans ta version finale, sinon le code risque de marcher moins bien _________________ The End of the Internet! |
|
Back to top |
|
|
BaNaNe Guru
Joined: 18 May 2003 Posts: 327 Location: Vous êtes ici...
|
Posted: Fri Jul 06, 2007 10:49 pm Post subject: |
|
|
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 |
|
|
truc Advocate
Joined: 25 Jul 2005 Posts: 3199
|
Posted: Sat Jul 07, 2007 7:22 am Post subject: |
|
|
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 |
|
|
|