在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: