Calcul adresse reseau perl

Résolu
kd54 Messages postés 7 Statut Membre -  
kd54 Messages postés 7 Statut Membre -
Bonjour,

je souhaite calculer, dans un script perl, une adresse reseau a partir de mon adresse ip et de mon masque.

Par exemple, si j'ai comme ip 192.168.10.45 et comme masque 255.255.255.0 j'aimerais recuperer dans une variable mon adresse reseau 192.168.10.0 .

Comme faire ?

Merci pour votre aide
Configuration: Solaris
Firefox 2.0.0.14

9 réponses

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Je n'ai pas testé.

    my $ip=.....;
    my $m=....;
    
    my ($x1,$x2,$x3,$x4)=split /\./,$ip;
    my ($m1,$m2,$m3,$m4) = split /\./,$m;
    
    my $reseau=$x1 & $m1 . "." . $x2 & $m2 . "." . $x3 & $m3 . "." . $x4 & $m4;
    autre version
    my $ip=.....;
    my $m=....;
    
    my @ip=split /\./,$ip;
    my @masque = split /\./,$m;
    
    push @reseau,$ip[$_] & $mask[$_] for 1..4;
    my $reseau=join ".",@reseau;

    0
  2. kd54 Messages postés 7 Statut Membre
     
    Je te remercie. La premiere partie fonctionne bien.

    Par contre, il y a un probleme avec le ET logique. Ca ne fonctionne pas.
    Si $x1 = 192 et $m1 = 255, l'operation $x1 & $m1 me renvoie 010

    Comment fait-on un "ET Logique" en perl ??
    0
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Essaie &&
    0
  4. kd54 Messages postés 7 Statut Membre
     
    non plus. J'avais deja essaye... Ca retourne soit 192 pour $x1 && $m1 soit 255 pour $m1 && $x1.

    C'est bizar avec un seul & ca devrait fonctionne...
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Affiche plutôt le script ainsi que l'exécution
    N'oublie pas de mettre use strict;use warnings; pour avoir les messages d'erreur/avertissement
    0
  7. loupius
     
    Comment fait-on un "ET Logique" en perl ??
    Non, c'est un opérateur 'bit à bit' que tu recherches.
    Et il s'agit bien de &.
    192 & 255 donne 192
    193 & 254 donne 192.
    Si ce n'est pas le cas, tu dois faire une erreur quelque part.
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    De toute façon c'est l'opérateur bit à bit qui doit être utiliser, je pense aussi pour une erreur de syntaxe quelque part.
    Comme je ne peux pas tester, il sera mieux qu'on vois le script.
    0
    1. loupius
       
      Tout à fait !
      Mais la question est: va-t-il donner son code ?
      Mystère ;-)
      0
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Ok, j'ai compris pourquoi ça ne marche pas.

    Les octets des adresses sont pris pour des chaînes de caractères.
    Exemple
    lami20j@debian:~/trash/ccm_perl$ perl -e 'print "192" & "255","\n"'
    010
    lami20j@debian:~/trash/ccm_perl$ perl -e 'print 192 & 255,"\n"'
    192
    
    Pourquoi?
    Puisque le point est l'opérateur de concaténation.
    Ce qui fait que 192.168.1.47 deviens une chaine de caractère et l'opérateur & donnera un résultat inattendu.Il suffit de forcer la conversion (j'ai utilise une addition avec zéro).
    Vu le contexte 0+192 sera le nombre 192 et pas la chaîne "192".
    Bref 0+192 ou 0+"192" donnera toujours un nombre tandis que 0.192 ou 0 . "192" c'est une chaine
    Voir en gras.
    #!/usr/bin/perl
    use strict;use warnings;
    
    my @reseau;
    my $ip="192.168.1.47";
    my $m="255.255.255.0";
    
    my @ip=split /\./,$ip;
    my @masque = split /\./,$m;
    
    push @reseau,0+$ip[$_] & $masque[$_] for 0 .. 3;
    my $reseau=join ".",@reseau;
    print "réseau $reseau\n";
    __END__
    lami20j@debian:~/trash/ccm_perl$ perl ccm_address_reseau.pl
    réseau 192.168.1.0
    

    0
    1. loupius
       
      Chapeau !
      Quelle belle démonstration !
      Comme on aimerait en avoir plus souvent ;-)
      0
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > loupius
         
        Salut,

        Merci.
        Bonne soirée ;-)
        0
  10. kd54 Messages postés 7 Statut Membre
     
    Merci beaucoup a tous les deux !!

    Desole de ne reapparaitre que maintenant mais je n'avais plus d'acces au net.

    Encore merci pour votre aide.

    salut
    0