#1 Le 21/06/2012, à 19:25
- demonipuch
[résolu] adresses ip privées et regex
Bonjour
Pour les besoins d'un script, j'aimerais tester si une adresse IP entrée par l'utilisateur est une adresse IP privée valide.
Après quelques recherches sur la toile, je suis arrivé à ça :
if [[ $(echo ${IP} | grep -oE '10\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.(25[0-4]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)') == "${IP}" ]]; then
echo "ok"
elif [[ $(echo ${IP} | grep -oE '172\.(1[6-9]|2[0-9]|3[0-1])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.(25[0-4]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)') == ${IP}" ]]; then
echo "ok"
elif [[ $(echo ${IP} | grep -oE '192\.168\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.(25[0-4]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)') == "${IP}" ]]; then
echo "ok"
else
echo "ko"
fi
Étant un noob complet en regex, j'aimerais savoir si il y a moyen de les simplifier...
Merci
Dernière modification par demonipuch (Le 21/06/2012, à 22:50)
Hors ligne
#2 Le 21/06/2012, à 21:27
- pingouinux
Re : [résolu] adresses ip privées et regex
Bonsoir,
Les regex pourraient effectivement être simplifiées. Cependant, comme tu connais IP dès le début, je pense qu'il est plus simple de partir de sa valeur :
IP=192.168.1.25
IFS="." N=( $IP )
echo ${N[@]}
N0=${N[0]}
N1=${N[1]}
N2=${N[2]}
N3=${N[3]}
et de faire des test numériques :
if (( $N0==192 && $N1==168 &&
( ($N2>=240 && $N2<=255) || ($N2>=0 && $N2<=199) ) &&
( ($N3>=240 && $N3<=255) || ($N3>=0 && $N3<=199) )
));
then
echo ok;
else
echo ko;
fi
Remarque :
Je ne suis pas sûr que ceci
[0-1]?[0-9][0-9]?
fasse ce que tu veux.
Dernière modification par pingouinux (Le 21/06/2012, à 21:46)
Hors ligne
#3 Le 21/06/2012, à 22:10
- demonipuch
Re : [résolu] adresses ip privées et regex
Merci pour cette réponse.
J'ai retouché un peu le bout de code pour utiliser ceci :
IFS="." N=( $IP )
N0=${N[0]}
N1=${N[1]}
N2=${N[2]}
N3=${N[3]}
if (( $N0==192 && $N1==168 && (($N2>=0 && $N2<=255)) && (($N3>=1 && $N3<=254)) ));
then
echo ok
elif (( $N0==172 && (( $N1>=16 && $N1<=31)) && (($N2>=0 && $N2<=255)) && (($N3>=1 && $N3<=254)) ));
then
echo ok
elif (( $N0==10 && (( $N1>=0 && $N1<=255)) && (($N2>=0 && $N2<=255)) && (($N3>=1 && $N3<=254)) ));
then
echo ok
else
echo ko
fi
Remarque :
Je ne suis pas sûr que ceci[0-1]?[0-9][0-9]?
Chercher les nombres entre 0 et 199? J'ai faux?
Sinon, sans vouloir abuser et par curiosité, comment aurais-je pu simplifier mes regex?
Hors ligne
#4 Le 21/06/2012, à 22:39
- pingouinux
Re : [résolu] adresses ip privées et regex
Quelques remarques :
if (( $N0==192 && $N1==168 && (($N2>=0 && $N2<=255)) && (($N3>=1 && $N3<=254)) ));
Les doubles parenthèses ne sont nécessaires qu'aux 2 extrémités. Cela suffisait :
if (( $N0==192 && $N1==168 && ($N2>=0 && $N2<=255) && ($N3>=1 && $N3<=254) ));
ou même (puisqu'il n'y a que des &&)
if (( $N0==192 && $N1==168 && $N2>=0 && $N2<=255 && $N3>=1 && $N3<=254 ));
[0-1]?[0-9][0-9]?
va correspondre à : 0, 1…9, 00, 01…99, 000, 001…099, 100, 101…199
if [[ $(echo ${IP} | grep -oE '10\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)\.(25[0-4]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)') == "${IP}" ]]; then
peut être remplacé par :
if grep -E '10(\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)){3}' <<<"$IP"; then
Dernière modification par pingouinux (Le 21/06/2012, à 22:43)
Hors ligne