Java修改Window或者Linux下的hosts文件实例代码介绍。



Java修改Window或者Linux下的hosts文件实例代码介绍。

host文件的作用:

简述和原理
在你用IE浏览网页的时候,是否碰到过这样的情况。有的网站会出现自动弹出的广告窗口,而且不止一个,占用了带宽,又很烦人。还有的网站进入时要求为浏览器安装插件的对话框,比如最常见3721网络实名和目前网上恶评如潮的淘宝网弹出广告。这些东西最讨厌,机器慢的时候,为了等待这个对话框弹出,要等很长时间,甚至有时候会让人以为机器死机,而且每次上都会弹出,十分讨厌。有些人提出可以用Maxthon gosurf等利用IE内核的多窗口浏览器来代替IE,这个方法是不错,不过IE的兼容性是最好的,而且IE普及率在90%以上,用的人还是最多的。还有些人提出可以通过修改注册表来解决,但是这种方法难度大,一般人不太懂,而且存在危险性,万一没改好,会给系统稳定造成很大影响。其实,只要改动一个名叫 hosts的文件,就可以轻松过滤这些烦人的垃圾,而且方便又安全。

在修改之前,我们先了解一下访问网站的原理。
用IE浏览器访问网站时,首先通过网络上的DNS(域名解析服务)服务器把网络域名,也就是通常所说的网址(比如www.sian.com.cn)解析成 61.172.201.227的IP地址,然后浏览器才能访问它。对于每个域名请求我们都要等待域名服务器解析后返回IP信息才能访问网站,这样访问网络的效率是比较低的。而根据Windows系统规定,在浏览器进行DNS请求以前,Windows系统会先检查自己的本地硬盘上的hosts文件中是否有这个网址映射关系,如果有就先调用这个IP地址映射,如果没有再向已知的DNS服务器提出域名解析。也就是说Hosts的请求级别比DNS高。Hosts文件中存在这个网址的IP地址映射的话,浏览器就是直接访问这个IP地址,而不去请求DNS解析了。

动手实战
搞清楚原理之后,我们就可以动手修改了。
在Windows 98和me系统下,hosts文件在Windows目录,在Windows 2000/XP系统中位于WinntSystem32DriversEtc目录中。Hosts文件没有后缀名,不过用记事本就能打开。右键单击hosts 文件,在“打开方式”中,选择用记事本打开。一般没有修改过的hosts文件,样子如下图

里面只做了一个映射,将localhost映射到127.0.0.1,也就是本机的IP地址。前面有#号的是说明,不起作用的。现在我们要做的事情,就是将这些插件和广告的网址映射到本机IP地址,这样就不会出现弹出窗口了。

屏蔽插件
首先去除3721的安装插件的提示对话框,将3721的网址都映射为127.0.0.1。
如果你已经安装了3721网络实名,先卸载掉。然后再hosts文件中输入以下内容:
127.0.0.1 www.3721.com
127.0.0.1 cnsmin.3721.com
127.0.0.1 download.3721.com
127.0.0.1 union.3721.com
127.0.0.1 3721.net
127.0.0.1 address.3721.com
127.0.0.1 assistant.3721.com

这里要注意,IP地址输入完毕,至少输入一个空格后再输入网址,空格多一点没有关系。还有,每行只能输入一个IP地址和网址。


里面只做了一个映射,将localhost映射到127.0.0.1,也就是本机的IP地址。前面有#号的是说明,不起作用的。现在我们要做的事情,就是将这些插件和广告的网址映射到本机IP地址,这样就不会出现弹出窗口了。

屏蔽插件
首先去除3721的安装插件的提示对话框,将3721的网址都映射为127.0.0.1。
如果你已经安装了3721网络实名,先卸载掉。然后再hosts文件中输入以下内容:
127.0.0.1 www.3721.com
127.0.0.1 cnsmin.3721.com
127.0.0.1 download.3721.com
127.0.0.1 union.3721.com
127.0.0.1 3721.net
127.0.0.1 address.3721.com
127.0.0.1 assistant.3721.com

这里要注意,IP地址输入完毕,至少输入一个空格后再输入网址,空格多一点没有关系。还有,每行只能输入一个IP地址和网址。

白色框内的就是it世界网站的IP地址,然后在hosts文件中输入以下内容

61.145.121.108 www.it.com.cn

输入完毕后保存,以后再访问it世界网站时,浏览器不会请求DNS解析而是直接调用hosts文件,这样就加快了访问速度。其他网站也可以按照这个方法操作。

2)安全问题
针对windows调用hosts文件的机制,有些病毒会采取修改hosts文件来达到某些目的。因此要注意hosts文件的安全性。除了安装杀毒软件之外,在修改和保存hosts文件后,要给hosts文件加上只读属性,防止病毒修改。
右键单击hosts文件,选择“属性”,弹出属性窗口,在“只读”前面打上勾,按“确定”退出

 

  1. public synchronized static boolean updateHostName(String hostName, String ip) throws Exception {
  2.        if (StringUtils.isEmpty(hostName) || StringUtils.isEmpty(ip)) {
  3.            throw new BusinessException(“HostName or Ip can’t be null.”);
  4.        }
  5.        if (StringUtils.isEmpty(hostName.trim()) || StringUtils.isEmpty(ip.trim())) {
  6.            throw new BusinessException(“HostName or Ip can’t be null.”);
  7.        }
  8.        String splitter = ” ”;
  9.        String fileName = null;
  10.        // 判断系统
  11.        if (“linux”.equalsIgnoreCase(System.getProperty(“os.name”))) {
  12.            fileName = ”/etc/hosts”;
  13.        } else {
  14.            fileName = ”C://WINDOWS//system32//drivers//etc//hosts”;
  15.        }
  16.        // 更新设定文件
  17.        List < ? > lines = FileUtils.readLines(new File(fileName));
  18.        List <String> newLines = new ArrayList <String>();
  19.        boolean findFlag = false;
  20.        boolean updateFlag = false;
  21.        for (Object line : lines) {
  22.            String strLine = (String) line;
  23.            if (StringUtils.isNotEmpty(strLine) && !strLine.startsWith(“#”)) {
  24.                strLine = strLine.replaceAll(“/t”, splitter);
  25.                int index = strLine.toLowerCase().indexOf(hostName.toLowerCase());
  26.                if (index != -1) {
  27.                    String[] array = strLine.trim().split(splitter);
  28.                    for (String name : array) {
  29.                        if (hostName.equalsIgnoreCase(name)) {
  30.                            findFlag = true;
  31.                            if (array[0].equals(ip)) {
  32.                                // 如果IP相同,则不更新
  33.                                newLines.add(strLine);
  34.                                break;
  35.                            }
  36.                            // 更新成设定好的IP地址
  37.                            StringBuilder sb = new StringBuilder();
  38.                            sb.append(ip);
  39.                            for (int i = 1; i < array.length; i++) {
  40.                                sb.append(splitter).append(array[i]);
  41.                            }
  42.                            newLines.add(sb.toString());
  43.                            updateFlag = true;
  44.                            break;
  45.                        }
  46.                    }
  47.                    if (findFlag) {
  48.                        break;
  49.                    }
  50.                }
  51.            }
  52.            newLines.add(strLine);
  53.        }
  54.        // 如果没有Host名,则追加
  55.        if (!findFlag) {
  56.            newLines.add(new StringBuilder(ip).append(splitter).append(hostName).toString());
  57.        }
  58.        if (updateFlag || !findFlag) {
  59.            // 写设定文件
  60.            FileUtils.writeLines(new File(fileName), newLines);
  61.            // 确认设定结果
  62.            String formatIp = formatIpv6IP(ip);
  63.            for (int i = 0; i < 20; i++) {
  64.                try {
  65.                    boolean breakFlg = false;
  66.                    InetAddress[] addressArr = InetAddress.getAllByName(hostName);
  67.                    for (InetAddress address : addressArr) {
  68.                        if (formatIp.equals(address.getHostAddress())) {
  69.                            breakFlg = true;
  70.                            break;
  71.                        }
  72.                    }
  73.                    if (breakFlg) {
  74.                        break;
  75.                    }
  76.                } catch (Exception e) {
  77.                    logger.warn(e.getMessage());
  78.                }
  79.                Thread.sleep(3000);
  80.            }
  81.        }
  82.        return updateFlag;
  83.    }
  84.    private static String formatIpv6IP(String ipV6Addr) {
  85.        String strRet = ipV6Addr;
  86.        StringBuffer replaceStr;
  87.        int iCount = 0;
  88.        char ch = ’:';
  89.        if (StringUtils.isNotEmpty(ipV6Addr) && ipV6Addr.indexOf(“::”) > -1) {
  90.            for (int i = 0; i < ipV6Addr.length(); i++) {
  91.                if (ch == ipV6Addr.charAt(i)) {
  92.                    iCount++;
  93.                }
  94.            }
  95.            if (ipV6Addr.startsWith(“::”)) {
  96.                replaceStr = new StringBuffer(“0:0:”);
  97.                for (int i = iCount; i < 7; i++) {
  98.                    replaceStr.append(“0:”);
  99.                }
  100.            } else if (ipV6Addr.endsWith(“::”)) {
  101.                replaceStr = new StringBuffer(“:0:0″);
  102.                for (int i = iCount; i < 7; i++) {
  103.                    replaceStr.append(“:0″);
  104.                }
  105.            } else {
  106.                replaceStr = new StringBuffer(“:0:”);
  107.                for (int i = iCount; i < 7; i++) {
  108.                    replaceStr.append(“0:”);
  109.                }
  110.            }
  111.            strRet = ipV6Addr.trim().replaceAll(“::”, replaceStr.toString());
  112.        }
  113.        return strRet;
  114.    }