Формируем текстовый файл:
Итоговый файл представляет из себя набор данных, разделённых запятыми, оформленных в три колонки:$ wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip $ unzip GeoIPCountryCSV.zip $ cut -d, -f3-5 < GeoIPCountryWhois.csv|sed 's/"//g' > geoip.txt
- начальный ip-адрес диапазона, в десятичной нотации;
- конечный ip-адрес диапазона, в десятичной нотации;
- мнемонический код страны.
Перевод ip-адреса в десятичную нотацию и обратно:
Организовать простой поиск ip в организованной выше базе адресов можно, например, так:my $in = "212.90.160.40"; my @a = split (/\./,$in); my $decip = (($a[0]<<24)+($a[1]<<16)+($a[2]<<8)+$a[3]); my $dotip = join ".",unpack("CCCC",pack("N",$decip)); print $decip," = ",$dotip,"\n";
и использовать подобным образом:#!/usr/bin/perl -w use strict; my $geoipdb = "./geoip.txt"; my $in = <>; chomp($in); if ($in =~ m!\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b!) { my @a = split(/\./,$in); my $decip = (($a[0]<<24)+($a[1]<<16)+($a[2]<<8)+$a[3]); open FGEOIP, "<$geoipdb" || die "Can't open $geoipdb: $!\n"; while (<FGEOIP>) {chomp; my ($bip,$eip,$c) = split(","); if ($decip>=$bip && $decip<=$eip) { print $in," is ",$c, "\n"; last; } } close FGEOIP; } else { print STDERR "Not IP on STDIN\n"; }
$ echo 212.90.160.40 | fgeoip 212.90.160.40 is UA
2 коментарі:
http://unixforum.org/index.php?s=&showtopic=130571&view=findpost&p=1200406
с тебя бутылка
Безусловно :) Как только окажусь в Питере или ты в Киеве :)
Дописати коментар