Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1407 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [PERL] Récupération ip/mac de dhcpd.leases [RESOLU]

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PERL] Récupération ip/mac de dhcpd.leases [RESOLU]

n°1950549
thecoco
Posté le 15-12-2009 à 15:08:21  profilanswer
 

Bonjour,
 
je souhaite mettre en place avec perl un moyen d'extraction de données stockées dans le fichier /var/lib/dhcp3/dhcpd.leases. Il s'agit d'un fichier issu d'un serveur dhcp sous debian qui liste les machines ayant obtenu une adresse ip auprès du serveur.
 
le contenu du fichier ressemble à ceci:
 
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-V3.1.1
 
lease 192.168.2.203 {
  starts 4 2009/12/10 08:13:02;
  ends 5 2009/12/11 08:13:02;
  tstp 5 2009/12/11 08:13:02;
  cltt 4 2009/12/10 08:13:02;
  binding state free;
  hardware ethernet 00:11:22:33:44:55;
  uid "\001\000\"\375L\031\310";
}
lease 192.168.2.204 {
  starts 4 2009/12/10 09:00:38;
  ends 5 2009/12/11 09:00:38;
  tstp 5 2009/12/11 09:00:38;
  cltt 4 2009/12/10 09:00:38;
  binding state free;
  hardware ethernet aa:bb:cc:dd:ee:ff;
  uid "\001\000\"\373z\332\276";
}
 
Il se peut qu'une ip soit présente plusieurs fois.
 
Ce que je souhaite, c'est copier dans un nouveau fichier les lignes contenant une ip et une adresse mac afin d'avoir une correspondance adresses ip/ adresses mac; et pourquoi pas la date aussi. mais concernant la date, j'ai déjà mis en place une autre solution.
 
J'arrive à extraire par exemple "192.168.2.203" pour le copier dans un nouveau fichier mais pas son adresse mac correspondante. et si cette ip est présente plusieurs fois, elle ne se retrouve qu'une fois dans le nouveau fichier.
 
mon script perl actuel:
 
#!/usr/bin/perl
 
# ouvre le fichier A en lecture seule
open (A, '</scripts/dhcpd.leases');
 
# tant que lecture ligne fichier
 
while ($ip=<A> )
 
{
# si adresse IP dans la ligne, capture l'IP
 
 if ($ip =~ /192\.168\.2\.200/)
 {
# ouvre en écriture le fichier B (s'il n'existe pas, il est créé)
 
  open (B, '>/scripts/dhcp3/dhcp_200');
 
  print B "$ip";
 }
}
 
close A;
close B;
 
pourriez vous m'aider s'il vous plait?
 
merci


Message édité par thecoco le 16-12-2009 à 13:27:46
mood
Publicité
Posté le 15-12-2009 à 15:08:21  profilanswer
 

n°1950682
gilou
Modérateur
Modzilla
Posté le 16-12-2009 à 00:32:58  profilanswer
 

Un exemple de truc fait rapidement dont tu peux t'inspirer
J'ai remplacé tes fichiers par leases.in et leases.out pour tester

Code :
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. my ($in, $out);
  7. my ($ip, $mac);
  8. my $macpattern = "(([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2})";
  9. # ouvre le fichier $in en lecture seule
  10. open($in, "<", 'leases.in') or die "cannot open $in for reading: $!";
  11. my $inleasebloc = 0;
  12. # tant que lecture ligne fichier
  13. while (<$in> ) {
  14.    if (not $inleasebloc) {
  15.        # si adresse IP dans la ligne, capture l'IP
  16.        if (/^lease\s+(\d+\.\d+\.\d+\.\d+)\s+\{/o) {
  17.            $inleasebloc = 1;
  18.            $ip = $1;
  19.        }
  20.    }
  21.    else {
  22.        if (/hardware\s+ethernet\s+$macpattern\s*;/o) {
  23.            $mac = $1;
  24.        }
  25.        if (/^\s*\}\s*$/) {
  26.            $inleasebloc = 0;
  27.            # ouvre en écriture le fichier $out (s'il n'existe pas, il est créé)
  28.            if (not defined($out)) {
  29.                open($out, ">", 'leases.out') or die "cannot open $out for writing: $!";
  30.            }
  31.            $mac = "unknown" unless defined($mac);
  32.            print $out "IP: $ip - MAC: $mac\n";
  33.            undef $mac;
  34.        }
  35.    }
  36. }
  37. close($in);
  38. close($out) if (defined($out));


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1950695
thecoco
Posté le 16-12-2009 à 08:05:09  profilanswer
 

merci beaucoup gilou :) je vais m'y mettre de ce pas merci

n°1950803
gilou
Modérateur
Modzilla
Posté le 16-12-2009 à 11:25:29  profilanswer
 

Tiens, en le relisant ce matin, je vois qu'il manque la raison pour laquelle j'ai créé le flag inleasebloc (pour vérifier la bonne cohérence des blocs):

Code :
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5.  
  6. my ($in, $out);
  7. my ($ip, $mac);
  8. my $macpattern = "(([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2})";
  9. # ouvre le fichier $in en lecture seule
  10. open($in, "<", 'leases.in') or die "cannot open $in for reading: $!";
  11. my $inleasebloc = 0;
  12. # tant que lecture ligne fichier
  13. while (<$in> ) {
  14.    if (not $inleasebloc) {
  15.        # si adresse IP dans la ligne, capture l'IP
  16.        if (/^lease\s+(\d+\.\d+\.\d+\.\d+)\s+\{/o) {
  17.            $inleasebloc = 1;
  18.            $ip = $1;
  19.        }
  20.    }
  21.    else {
  22.        if (/^lease\s+(\d+\.\d+\.\d+\.\d+)\s+\{/o) {
  23.            # On pourrait émettre un message d'erreur comme quoi le bloc n'est pas fermé correctement
  24.            if (not defined($out)) {
  25.                open($out, ">", 'leases.out') or die "cannot open $out for writing: $!";
  26.            }
  27.            $mac = "unknown" unless defined($mac);
  28.            print $out "IP: $ip - MAC: $mac\n";
  29.            undef $mac;
  30.            $inleasebloc = 1;
  31.            $ip = $1;
  32.        }
  33.        if (/hardware\s+ethernet\s+$macpattern\s*;/o) {
  34.            $mac = $1;
  35.        }
  36.        if (/^\s*\}\s*$/) {
  37.            $inleasebloc = 0;
  38.            # ouvre en écriture le fichier $out (s'il n'existe pas, il est créé)
  39.            if (not defined($out)) {
  40.                open($out, ">", 'leases.out') or die "cannot open $out for writing: $!";
  41.            }
  42.            $mac = "unknown" unless defined($mac);
  43.            print $out "IP: $ip - MAC: $mac\n";
  44.            undef $mac;
  45.        }
  46.    }
  47. }
  48. close($in);
  49. close($out) if (defined($out));


A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°1950877
thecoco
Posté le 16-12-2009 à 13:27:17  profilanswer
 

encore merci, ça marche impec :)
 
mais comment fais tu pour afficher du code dans un carré comme ça?

n°1951054
gilou
Modérateur
Modzilla
Posté le 17-12-2009 à 02:31:13  profilanswer
 

Il faut utiliser le bbcode [code=perl]...[/code]
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [PERL] Récupération ip/mac de dhcpd.leases [RESOLU]

 

Sujets relatifs
Pb avec XML en AS3 [Résolu][RESOLU] Modification multiple de champs SQL
[Resolu] Requête SQL utra-looooongue...cgi perl: comment fermer la connexion serveur en continuant le script
Configuration de wamp[PHP] Creer un fichier avec un encodage Windows [Résolu]
[KSH][RESOLU]Enlever $ situé en fin de chaine s'il existe [HELP]Simplifieur de code source perl
[PERL] Out of memory sur Win7 x64 [RESOLU] 
Plus de sujets relatifs à : [PERL] Récupération ip/mac de dhcpd.leases [RESOLU]


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR