用Java修改Window或者Linux下的hosts文件

host文件的做用:html

簡述和原理
  在你用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文件,樣子以下圖
linux


裏面只作了一個映射,將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地址和網址。
windows

裏面只作了一個映射,將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文件,選擇「屬性」,彈出屬性窗口,在「只讀」前面打上勾,按「肯定」退出
安全

public synchronized static boolean updateHostName(String hostName, String ip) throws Exception {
        if (StringUtils.isEmpty(hostName) || StringUtils.isEmpty(ip)) {
            throw new BusinessException("HostName or Ip can't be null.");
        }

        if (StringUtils.isEmpty(hostName.trim()) || StringUtils.isEmpty(ip.trim())) {
            throw new BusinessException("HostName or Ip can't be null.");
        }

        String splitter = " ";
        String fileName = null;

        // 判斷系統
        if ("linux".equalsIgnoreCase(System.getProperty("os.name"))) {
            fileName = "/etc/hosts";
        } else {
            fileName = "C://WINDOWS//system32//drivers//etc//hosts";
        }

        // 更新設定文件
        List < ? > lines = FileUtils.readLines(new File(fileName));
        List <String> newLines = new ArrayList <String>();
        boolean findFlag = false;
        boolean updateFlag = false;
        for (Object line : lines) {
            String strLine = (String) line;
            if (StringUtils.isNotEmpty(strLine) && !strLine.startsWith("#")) {
                strLine = strLine.replaceAll("/t", splitter);
                int index = strLine.toLowerCase().indexOf(hostName.toLowerCase());
                if (index != -1) {
                    String[] array = strLine.trim().split(splitter);
                    for (String name : array) {
                        if (hostName.equalsIgnoreCase(name)) {
                            findFlag = true;
                            if (array[0].equals(ip)) {
                                // 若是IP相同,則不更新
                                newLines.add(strLine);
                                break;
                            }
                            // 更新成設定好的IP地址
                            StringBuilder sb = new StringBuilder();
                            sb.append(ip);
                            for (int i = 1; i < array.length; i++) {
                                sb.append(splitter).append(array[i]);
                            }
                            newLines.add(sb.toString());
                            updateFlag = true;
                            break;
                        }
                    }

                    if (findFlag) {
                        break;
                    }
                }
            }
            newLines.add(strLine);
        }
        // 若是沒有Host名,則追加
        if (!findFlag) {
            newLines.add(new StringBuilder(ip).append(splitter).append(hostName).toString());
        }

        if (updateFlag || !findFlag) {
            // 寫設定文件
            FileUtils.writeLines(new File(fileName), newLines);

            // 確認設定結果
            String formatIp = formatIpv6IP(ip);
            for (int i = 0; i < 20; i++) {
                try {
                    boolean breakFlg = false;
                    InetAddress[] addressArr = InetAddress.getAllByName(hostName);

                    for (InetAddress address : addressArr) {
                        if (formatIp.equals(address.getHostAddress())) {
                            breakFlg = true;
                            break;
                        }
                    }

                    if (breakFlg) {
                        break;
                    }
                } catch (Exception e) {
                    logger.warn(e.getMessage());
                }

                Thread.sleep(3000);
            }
        }

        return updateFlag;
    }

    private static String formatIpv6IP(String ipV6Addr) {
        String strRet = ipV6Addr;
        StringBuffer replaceStr;
        int iCount = 0;
        char ch = ':';
        
        if (StringUtils.isNotEmpty(ipV6Addr) && ipV6Addr.indexOf("::") > -1) {
            for (int i = 0; i < ipV6Addr.length(); i++) {
                if (ch == ipV6Addr.charAt(i)) {
                    iCount++;
                }
            }

            if (ipV6Addr.startsWith("::")) {
                replaceStr = new StringBuffer("0:0:");
                for (int i = iCount; i < 7; i++) {
                    replaceStr.append("0:");
                }
            } else if (ipV6Addr.endsWith("::")) {
                replaceStr = new StringBuffer(":0:0");
                for (int i = iCount; i < 7; i++) {
                    replaceStr.append(":0");
                }
            } else {
                replaceStr = new StringBuffer(":0:");
                for (int i = iCount; i < 7; i++) {
                    replaceStr.append("0:");
                }
            }
            strRet = ipV6Addr.trim().replaceAll("::", replaceStr.toString());
        }
        
        return strRet;
    }
相關文章
相關標籤/搜索