Calcul adresse reseau perl

Résolu/Fermé
kd54 Messages postés 6 Date d'inscription mardi 31 mars 2009 Statut Membre Dernière intervention 6 mai 2009 - 24 avril 2009 à 10:16
kd54 Messages postés 6 Date d'inscription mardi 31 mars 2009 Statut Membre Dernière intervention 6 mai 2009 - 27 avril 2009 à 10:03
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

9 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 avril 2009 à 10:38
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
kd54 Messages postés 6 Date d'inscription mardi 31 mars 2009 Statut Membre Dernière intervention 6 mai 2009
24 avril 2009 à 11:24
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 avril 2009 à 11:40
Re,

Essaie &&
0
kd54 Messages postés 6 Date d'inscription mardi 31 mars 2009 Statut Membre Dernière intervention 6 mai 2009
24 avril 2009 à 11:47
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 avril 2009 à 12:07
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
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
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 avril 2009 à 12:17
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
Tout à fait !
Mais la question est: va-t-il donner son code ?
Mystère ;-)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
24 avril 2009 à 19:28
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
Chapeau !
Quelle belle démonstration !
Comme on aimerait en avoir plus souvent ;-)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > loupius
24 avril 2009 à 22:14
Salut,

Merci.
Bonne soirée ;-)
0
kd54 Messages postés 6 Date d'inscription mardi 31 mars 2009 Statut Membre Dernière intervention 6 mai 2009
27 avril 2009 à 10:03
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