在PC上自动更新hosts列表的方法

上一篇 / 下一篇  2012-01-25 00:10:12 / 个人分类:个人文集

前些天写了《通过国外SSH自动更新hosts列表》,经过在网上交流,这个方法对SSH是有权限要求的,很多国外SSH不允许上传程序运行。

但是,权限再低,SSH还是可以做成一个本地socks5代理的,本文就是通过socks5代理在PC上更新hosts。

本来有一个简单的方法,就是通过PC上nslookup -vc的命令自动处理就可以了。但有人发现,某些域名在通过nslookup -vc查询时会引发连接reset,试了一下确实如此。

本文是讨论通过socks5代理来更新hosts,过程是:
1. 首先通过国外SSH在本地做一个socks5代理,这个网上有很多实现方法,不再多说。
2. 下载并运行DNS2SOCKS.exe,使用前面做的本机socks5代理。(这个程序是刚在网上发现的,作用是设定dns通过socks5代理解析)。
3. 运行下面的Perl程序,dns.txt是旧的hosts文件,程序按照文件内容,逐个通过socks5代理查询IP,并把结果保存在hosts。

PC系统是XP,其他的windows系统没测试。其实,开着VPN更新hosts是最简单的,但需要对下面的程序的查询方式稍做修改。

------1.27补充几点说明:--------
1. 本文所说的“更新hosts列表”是指对hosts的内容重新逐个验证,并保存下来查询结果,并非指直接从网上下载一份新的hosts文件。
2. 不要使用dns2socks.exe直接连接国外socks5代理,因为这样还是会偶尔引发连接reset,使用SSH作为socks5代理,是因为SSH连接本身是加密的。
3. 国外SSH如果权限允许,还是最方便的,Perl程序可以直接运行,一个近千行的hosts文件不到两分钟就更新完毕。在XP上还要安装Perl运行软件,ActivePerl或StrawberryPerl。

#!/usr/bin/perl

open (f1,"dns.txt");
my @list = <f1>;
close f1;

open (f1,">hosts");

foreach $list (@list)
{
 my $qs2='';
 my $domain = '';
 my @t = split (" ",$list);

 if ($t[0]!~/#/) {$domain = $t[1]};

 if ($domain)    
 {
  $qs = `nslookup $domain 127.0.0.1`;
  $qs =~s/\n|\r//g;

 # 在XP系统上的处理
 if ($qs=~/Addresses/)
 {
  if ($qs=~/Addresses:  (.*?),/)
  { $qs2 = $1; }
 }
 else
 {
  if ($qs=~/Aliases/)
  {
   ($temp,$qs2)=($qs=~/Address:(.*?)Address:  (.*)Aliases/);
   $temp='';
  }
  else
  {
   ($temp,$qs2)=($qs=~/Address:(.*?)Address:  (.*)/);
   $temp='';
  }
 }
 }

 if ($qs2)
 {
  $qs2=~s/ //;
  print  "\n$qs2 $domain";
  print f1 "\n$qs2 $domain";
 }
}

close f1;


 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

我的栏目

日历

« 2012-05-24  
  12345
6789101112
13141516171819
20212223242526
2728293031  

数据统计

  • 访问量: 4872
  • 日志数: 64
  • 图片数: 3
  • 建立时间: 2009-03-16
  • 更新时间: 2012-04-15

RSS订阅

Open Toolbar