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从远程主机执行该命令行的截图:
===
真理是伟大的,如果让她自行其道的话,必然会盛行于世。真理是谬误的强劲克星,她无所畏惧,所向无敌,惟有害怕人们解除她的天然武器 —— 自由地论争和思辨;当批判被允许自由进行的时候,谬误也就没什么可怕了 —— 托玛斯·杰弗逊