Quantcast
Channel: OpenWares | Open Source and Free Matters » Perl
Viewing all articles
Browse latest Browse all 2

traceroute: 使用纯真IP数据库显示中间路由器以及主机的地理位置

$
0
0

traceroute是常用的网络诊断和查询工具,但是通常traceroute只能显示中间路由器和主机的ip地址和主机名,如果能输出机器的地理位置是最好不过了。怎么办?重新写一个traceroute?这是windows的思路。traceroute已经足够好了,为什么要重写呢,我们只要把结果加工一下就可以了。不得不佩服UNIX的设计哲学,无疑这种正交的功能,如果硬要搀和在一起,实在是没什么必要和额外的好处。

有了查询纯真IP数据库的Perl程序ip_geo_qqwry.pl,让traceroute显示机器的地理位置是十分简单的事情。把traceroute的输出重定向到一个脚本,脚本中将ip替换成对应的地理位置就可以了。下面是这个perl脚本ip2geo.pl的代码:

 1 #!/usr/bin/perl
 2
 3 binmode(STDOUT, :encoding(utf8));
 4 require "ip_geo/ip_geo_qqwry.pl";
 5
 6 my $pattern_ip = \(((?:(?:1?[0-9]?[0-9]|2(?:[0-4][0-9]|5[0-5]))\.){3}(?:1?[0-9]?[0-9]|2(?:[0-4][0-9]|5[0-5])))\);
 7 my $line,$matches, $match, $ip_geo_addr;
 8 while($line = <STDIN>){
 9     @matches = $line =~ /$pattern_ip/g;
10     foreach $match (@matches){
11         $ip_geo_addr = &ipwhere($match);
12         $line =~ s/\($match\)/[$ip_geo_addr]/;
13     }
14     print $line;
15 }
16
17 1;

然后这样traceroute www.google.cn | ip2geo.pl就可以看到中间路由器和主机的地理位置了。
下面是我用PuTTY从远程主机执行该命令行的截图:traceroute

===
真理是伟大的,如果让她自行其道的话,必然会盛行于世。真理是谬误的强劲克星,她无所畏惧,所向无敌,惟有害怕人们解除她的天然武器 —— 自由地论争和思辨;当批判被允许自由进行的时候,谬误也就没什么可怕了 —— 托玛斯·杰弗逊


Viewing all articles
Browse latest Browse all 2

Trending Articles