Readers: 34
1
2
3
4
5
Wed Mar 23 13:00:28 2011 : Auth: Login OK: [00-11-0A-FA-FB-AA/NOPASSWORD] (from client kgn751 port 31045 cli 00-11-0A-FA-FB-AA)
Wed Mar 23 13:01:02 2011 : Auth: Login OK: [00-0B-5D-0B-D6-44/NOPASSWORD] (from client WabeN7-55 port 11031 cli 00-0B-5D-0B-D6-44)
Wed Mar 23 13:01:22 2011 : Auth: Login OK: [00-00-85-7B-44-F7/NOPASSWORD] (from client e1-110-west port 36 cli 00-00-85-7B-44-F7)
Wed Mar 23 13:01:37 2011 : Auth: Login OK: [00-C4-FF-7F-34-07/NOPASSWORD] (from client e1-111-west port 76 cli 00-C4-FF-7F-34-07)
Wed Mar 23 13:05:29 2011 : Auth: Login OK: [08-37-FF-0C-E7-39/NOPASSWORD] (from client e1-140-west port 3 cli 08-37-FF-0C-E7-39)
1
2
3
4
5
6
7
8
9
10
11
12
13
00-11-0A-**-**-**
00-10-83-**-**-**
00-01-E6-**-**-**
00-00-85-**-**-**
08-00-09-**-**-**
00-60-B0-**-**-**
00-C0-EE-**-**-**
show multiauth session mac VOLLSTÄNDIGE-MAC-ADRESSE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use strict;
use IO::File;
use File::stat;
my $fh = new IO::File 'radius.log', O_RDONLY or die $!;
my $st = stat($fh) or die $!;
my $len = $st->[7];
my $data;
read $fh, $data, $len;
my @lines = split /\n/, $data;
foreach my $line(@lines){
$line =~ /^(\w+\s+\w+\s+\d+\s+\d{2}:\d{2}:\d{2}\s+\d{4})\s+:\s+(\w+):(.*):\s+\[(.*)\]\s+\((.*)\)$/;
#printf "Date => %s, Auth => $2, Mesg => $3, MAC/X => $4, Client => $5\n", $1, $2, $3, $4, $5;
printf "Client: %s\n", $5;
}
2011-03-25T12:49:14 pqhaben zeile 10-12 hier irgendwelche vorteile gegenüber einem einfachen:
my @lines = <$fh>;
?
2011-03-25T13:04:01 rostiNein, ganz im Gegenteil: ein radius.log kann sehr groß werden, es ist besser, das log im Textmodus zu öffnen und zeilenweise durchzugehen. Ich habe das lediglich zum Testen der Expressions mal so gemacht.
@lines = <$fh>;
würde ich bei großen Dateien (> 5 MB) nicht machen.
1 2 3 4 5 6
my $st = stat($fh) or die $!; my $len = $st->[7]; my $data; read $fh, $data, $len; my @lines = split /\n/, $data;
my @lines = <$fh>;
2011-03-25T13:25:04 rosties gibt keinen Vorteil. Es ist nur eine Gewohnheit von mir, eine Datei mit read() auf einen String zu lesen in einem Rutsch.
2011-03-25T13:37:55 topegDie verhalten sich nicht mal äquivalent. beim einen werden die Newlines entfernt beim anderen nicht.
2011-03-25T13:37:55 topegIm Speicher werden die Daten doppelt gehalten. Einmal in $data und einmal in @lines das halte ich für einen Nachteil.
QuoteAußerdem kann es passieren dass zu wenige Daten gelesen werden. Ich bin schon auf Betriebssysteme bzw. Dateisysteme gestoßen die haben die komprimierte Größe deiner Datei angezeigt nicht die tatsächliche. Hättest du davon so gelesen hättest du 50-70% der Datei vergessen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
#! /usr/bin/perl use strict; use warnings; while ( defined( my $line = <DATA> ) ) { # wenn beide Regex zutreffen if ( ( my ( $client ) = $line =~ m/client\s(\S+)/ ) # nach client steht der hostname && ( my ( $mac ) = $line =~ m/cli\s([-\da-fA-F]+)/ ) # nach cli steht die MAC ) { # tu was mit beiden ermittelten Werten print "$client: $mac\n"; } } __DATA__ Wed Mar 23 13:00:28 2011 : Auth: Login OK: [00-11-0A-FA-FB-AA/NOPASSWORD] (from client kgn751 port 31045 cli 00-11-0A-FA-FB-AA) Wed Mar 23 13:01:02 2011 : Auth: Login OK: [00-0B-5D-0B-D6-44/NOPASSWORD] (from client WabeN7-55 port 11031 cli 00-0B-5D-0B-D6-44) Wed Mar 23 13:01:22 2011 : Auth: Login OK: [00-00-85-7B-44-F7/NOPASSWORD] (from client e1-110-west port 36 cli 00-00-85-7B-44-F7) Wed Mar 23 13:01:37 2011 : Auth: Login OK: [00-C4-FF-7F-34-07/NOPASSWORD] (from client e1-111-west port 76 cli 00-C4-FF-7F-34-07) Wed Mar 23 13:05:29 2011 : Auth: Login OK: [08-37-FF-0C-E7-39/NOPASSWORD] (from client e1-140-west port 3 cli 08-37-FF-0C-E7-39)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use strict;
use Data::Dump qw(dump);
use Carp;
my $res = {}; # Results
my $i = 1;
while(my $line = <DATA>){
$line =~ /\((.*)\)/;
my @in = split /\s+/, $1;
my $s = qq($i => {$in[1] => "$in[2]", $in[5] => "$in[6]"});
#print "$s\n";
my $ref = eval($s) or croak "$@\n";
$res->{$i} = $ref;
$i++;
}
print dump $res;
__END__
Wed Mar 23 13:00:28 2011 : Auth: Login OK: [00-11-0A-FA-FB-AA/NOPASSWORD] (from client kgn751 port 31045 cli 00-11-0A-FA-FB-AA)
Wed Mar 23 13:01:02 2011 : Auth: Login OK: [00-0B-5D-0B-D6-44/NOPASSWORD] (from client WabeN7-55 port 11031 cli 00-0B-5D-0B-D6-44)
Wed Mar 23 13:01:22 2011 : Auth: Login OK: [00-00-85-7B-44-F7/NOPASSWORD] (from client e1-110-west port 36 cli 00-00-85-7B-44-F7)
Wed Mar 23 13:01:37 2011 : Auth: Login OK: [00-C4-FF-7F-34-07/NOPASSWORD] (from client e1-111-west port 76 cli 00-C4-FF-7F-34-07)
Wed Mar 23 13:05:29 2011 : Auth: Login OK: [08-37-FF-0C-E7-39/NOPASSWORD] (from client e1-140-west port 3 cli 08-37-FF-0C-E7-39)
1
2
3
4
5
6
7
{
1 => { cli => "00-11-0A-FA-FB-AA", client => "kgn751" },
2 => { cli => "00-0B-5D-0B-D6-44", client => "WabeN7-55" },
3 => { cli => "00-00-85-7B-44-F7", client => "e1-110-west" },
4 => { cli => "00-C4-FF-7F-34-07", client => "e1-111-west" },
5 => { cli => "08-37-FF-0C-E7-39", client => "e1-140-west" },
}
1
2
3
4
5
6
7
8
9
-Öffne Datei radius.log
-gehe diese Datei Zeilenweise durch und teile jede Zeile auf (Trennungszeichen ist ein Leerzeichen)
#So hätte man problemlos die MAC und den Switch in einem "Block"
-Durchsuche den "MAC-Block" nun auf eine der folgenden Strings: 00-11-0A ODER 00-10-83 ODER 00-01-E6
ODER 00-00-85 ODER 08-00-09 ODER 00-60-B0 ODER 00-C0-EE
-Bei einem Treffer nehme den Inhalt des "Switch-Blocks" und erstelle daraus eine Datei mit eben diesem Inhalt
als Dateinamen und .cfg als Datei-Endung (vorher Prüfung ob Datei schon vorhanden, sonst lediglich Datei
zum schreiben öffnen) schreibe danach den Inhalt des "MAC-Blocks" in die Datei.
-Wiederhole diesen Schritt bis zum Ende der Datei
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
use strict;
use IO::File;
use File::stat;
my $fh = new IO::File 'radius.log', O_RDONLY or die $!;
my $st = stat($fh) or die $!;
my $len = $st->[7];
my $feld1;
my $feld2;
my $switch;
my $feld4;
my $feld5;
my $feld6;
my $mac;
my $data;
read $fh, $data, $len;
my @lines = split /\n/, $data;
foreach my $line(@lines){
$line =~ /^(\w+\s+\w+\s+\d+\s+\d{2}:\d{2}:\d{2}\s+\d{4})\s+:\s+(\w+):(.*):\s+\[(.*)\]\s+\((.*)\)$/;
#printf "Date => %s, Auth => $2, Mesg => $3, MAC/X => $4, Client => $5\n", $1, $2, $3, $4, $5;
($feld1,$feld2,$switch,$feld4,$feld5,$feld6,$mac)= split(/\s+/,$5); #Trennung durch Whitespace
print "$switch\n"; #Gibt alle Switch-Namen untereinander aus
}