Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 21/06/2012, à 18: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, à 21:50)

Hors ligne

#2 Le 21/06/2012, à 20: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, à 20:46)

Hors ligne

#3 Le 21/06/2012, à 21: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, à 21:39

pingouinux

Re : [résolu] adresses ip privées et regex

Quelques remarques :

  1. 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 ));
  2. [0-1]?[0-9][0-9]?

    va correspondre à : 0, 1…9, 00, 01…99, 000, 001…099, 100, 101…199

  3. 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, à 21:43)

Hors ligne

#5 Le 21/06/2012, à 21:50

demonipuch

Re : [résolu] adresses ip privées et regex

Ok merci pour les précisions.

Hors ligne