Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3[/thread]

IP mit Wildcards: Wie ignoriert man dynam. IP's mit WC?



<< |< 1 2 >| >> 12 Einträge, 2 Seiten
[E|B]
 2003-08-09 18:27
#2732 #2732
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hi!
Hab ein kleines großes Problem und schaffe es einfach nicht einen passenden Algorithmus zu schreiben oder ich stehe gerade auf dem Schlauch.
Problem:
Die Variable $ip hat folgenden Inhalt:

Code: (dl )
$ip = "124.353.54.25,8**.32*.47.**";


Ein einfaches CSV Beispiel. Das erste Feld beinhaltet eine statische IP, das zweite Feld eine dynamische.
Wenn jetzt ein User das Script ausführt, soll dieses prüfen, ob die in der Variable stehenden IP Adressen auf seine passt oder passen könnte, da manche Stellen wie man sieht nur als Wildcards stehen.
Ein Beispiel:
Ein User mit der IP "845.325.47.68" kommt. Nun soll das Script erkennen, dass die zweite IP im CSV Feld auf diese IP passt.
Nur wie mache ich das? Die Wildcards können beliebig stehen. So zum Beispiel auch so:

Code: (dl )
**2.**5.**.35


Es können auch beliebig viele IP Adressen durch Kommas in der Variable $ip stehen.
Ziemlich kompliziert, aber vielleicht weiß jemand Rat.
Danke!
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
SirLant
 2003-08-09 19:00
#2733 #2733
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Vergleich die IPs doch direkt miteinander, also so:
IP1: IP2:
8 => 8
* => 4
* => 5
. => .
3 => 3
2 => 2
* => 5
. => .
4 => 4
7 => 7
. => .
* => 6
* => 8

Dort wo links zahlen stehen, muss rechts ebenfalls eine Zahl stehen, dort wo ein * ist darf jedes Zeichen stehen.
Kannst so ja wunderbar in nen Hash einfügen,dann mit ner foreach-schleife durchlaufen und nen Vergleich machen:
foreach (keys (%hash)){
next if $_ eq '*';
if(!$_ eq $hash{$_}){
return 0;
}
}
Jedenfalls so ungefähr, denke du wirst da eh ne Funktion basteln
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
[E|B]
 2003-08-09 19:21
#2734 #2734
User since
2003-08-08
2561 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Super! Darauf wäre ich jetzt gar nicht gekommen! Danke!
Gruß, Erik!

s))91\&\/\^z->sub{}\(\@new\)=>69\&\/\^z->sub{}\(\@new\)=>124\&\/\^z->sub{}\(\@new\)=>);
$_.=qq~66\&\/\^z->sub{}\(\@new\)=>93~;for(@_=split(/\&\/\^z->sub{}\(\@new\)=>/)){print chr;}

It's not a bug, it's a feature! - [CGI-World.de]
esskar
 2003-08-09 19:29
#2735 #2735
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmm

wie siehts aus:

Code: (dl )
1
2
3
4
5
 "192.***.***.***" macht das auf
"192.123.123.123"
"192.123.123.12"
"192.123.123.1"


???
kabel
 2003-08-09 19:35
#2736 #2736
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
[E|B
,09.08.2003, 16:27]
Code: (dl )
$ip = "124.353.54.25,8**.32*.47.**";


Ein User mit der IP "845.325.47.68" kommt.

so ein match ist sehr ungewöhnlich, da ip-addressen normalerweise in bändern zusammengefasst werden, dann zu subnetzen, etc. ich hoffe, das ist wirklich das, was ihr wollt!

scnr habt ihr spezialrouter für die "ip"-addressen? 8)
-- stefan
kabel
 2003-08-09 19:49
#2737 #2737
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
cool wäre natürlich eine implementierung ala
http://search.cpan.org/author/LUISMUNOZ/Tie-NetAddr-IP-1.51/IP.pm
also einen tied hash, der per zuweisung erfährt, welche ips du matchen willst, und dann den index in die entsprechende CSV-Zeile liefert.

Code: (dl )
1
2
3
4
5
6
7
use Net::IP::GenericMatch;
my $csv_line = "124.353.54.25,8**.32*.47.**";
my %IP; tie %IP, "Net::IP::GenericMatch", $csv_line;
print "[" . $IP{124.353.54.25} . "]\n"; # schreibt 1
print "[" . $IP{834.323.47.12} . "]\n"; # schreibt 2
print "[" . $IP{124.353.54.2522} . "]\n"; # warnung, da undefiniert
untie %IP;


falls mehrere bereiche auf eine ip matchen, können mehrere strategien angewendet werden, z.b. rückgabe eines anonymen arrays mit den indexen drin etc. eventuell müssen die ips noch gequotet werden ???

btw diese gedanken technik heisst wishful thinking. ;)
-- stefan
kabel
 2003-08-10 10:09
#2738 #2738
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
ok, ich habs halb implementiert .. ist nicht so der hit, denn der tie-mechanismus ist leider etwas eingeschränkt (FETCH zwingt den rückgabewert immer in ein skalar, unabhängig vom kontext).

ausserdem dürfte das overkill sein für die anwendung - aber trotzdem irgendwie edel :)\n\n

<!--EDIT|kabel|1060495838-->
-- stefan
Strat
 2003-08-10 12:48
#2739 #2739
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
IP-Adressen sind ja eigentlich vier Hexzahlenpaare. Erleichtert dies vielleich den Algorithmus irgendwie?

Habe mir mal vor einiger Zeit eine Regex zusammengestellt, die IP4-Adressen erkennt (auf Basis Dezimal, ab perl 5.005).

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#! /usr/bin/perl 

for my $ip (@ARGV) {
chomp($ip);

if ($ip =~ /^
( 2(5[0-5]|[0-4]\d)|([01]?\d?\d) )
\.
( 2(5[0-5]|[0-4]\d)|([01]?\d?\d) )
\.
( 2(5[0-5]|[0-4]\d)|([01]?\d?\d) )
\.
( 2(5[0-5]|[0-4]\d)|([01]?\d?\d) )
$/x) {
print "$ip ist eine IP\n";
}
else {
print " $ip ist keine IP\n";
}
} # for

Vielleicht hilft dir das irgendwie weiter?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
kabel
 2003-08-10 13:29
#2740 #2740
User since
2003-08-04
704 Artikel
BenutzerIn
[default_avatar]
strat, die regexen sind bereits in dem modul Regexp::Common gekapselt:

Quote
Regexp::Common::net
Provides regexes for IPv4 addresses and MAC addresses.


HTH\n\n

<!--EDIT|kabel|1060507780-->
-- stefan
Strat
 2003-08-10 13:31
#2741 #2741
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=kabel,10.08.2003, 11:29]strat, die regexen sind bereits in dem modul Regexp::Common gekapselt:[/quote]
Ups, an dieses Modul habe ich nicht gedacht... muss ich gleich mal schauen, ob es auch effizienter geht...

[update]Witzig, die verwenden ziemlich die gleiche Loesung... vielleicht bin ich bei regulaeren Ausdruecken gar nicht so schlecht ;-)[/update]\n\n

<!--EDIT|Strat|1060508575-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 12 Einträge, 2 Seiten



View all threads created 2003-08-09 18:27.