`
songylwq
  • 浏览: 129730 次
  • 性别: Icon_minigender_1
  • 来自: 济南
文章分类
社区版块
存档分类
最新评论

用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.1www.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.1www.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.108www.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;
    }


分享到:
评论

相关推荐

    如何修改hosts文件

    叫你如何修改hosts文件。简单方便快捷,想看更多开发小技巧,请多多关注一下,谢谢!

    java代码在window获取linux文件

    本篇将详细介绍如何使用Java和JSch在Windows上实现对Linux服务器的文件获取。 首先,我们需要理解SSH(Secure Shell)协议。SSH是一种网络协议,用于安全地远程登录到服务器,执行命令和传输数据。JSch库实现了SSH2...

    Java版Linux文件上传下载、windows本地文件上传下载

    在Java编程环境中,实现Linux与Windows之间的文件上传和下载是一项常见的任务,特别是在分布式系统和跨平台应用中。本文将深入探讨如何使用Java技术实现在Linux和Windows之间进行文件的互传,以及创建一个HTML界面来...

    Java-Linux环境下OpenCV本机库文件

    在Windows操作系统下,本机库文件的扩展名通常是`.dll`(动态链接库),而在Linux操作系统下,本机库文件的扩展名通常是`.so`(共享对象)。这是由于不同操作系统使用不同的二进制格式和加载机制。 原因如下: 1. ...

    [成品功能]Java文件上传下载(支持断点续传)支持跨平台Linux/Window

    首先执行根目录下的sql,然后在CloudSystem\WEB-INF\classes下在address.properties修改文件存法的路径(linux例如/usr/local,Window如E:\\temp1122) 然后在dbconfig下修改你的 数据库 连接,然后大功告成了!打开 ...

    window+linux java图像处理依赖包

    window+linux java图像处理依赖包,包含ffmpeg-4.3.1-1.5.4.jar,ffmpeg-4.3.1-1.5.4-linux-arm64.jar,ffmpeg-4.3.1-1.5.4-linux-x86.jar,ffmpeg-4.3.1-1.5.4-windows-x86_64.jar,ffmpeg-platform-4.3.1-1.5.4.jar...

    window下共享linux文件工具

    标题中的“window下共享linux文件工具”指的是在Windows操作系统中,如何与Linux系统进行文件共享和传输的方法。这种需求在日常工作中很常见,特别是在多平台协作的环境中。WinSCP4是其中一种常用的工具,它是...

    window 与 Linux文件共享

    在本文中,我们将讨论使用 VMware 共享文件夹功能来实现 Window 和 Linux 之间的文件共享。这种方法无需任何网络相关设置,不使用任何网络协议,host 和 ghost 可以是 Linux 和 Windows 操作系统。 安装 VMware ...

    linux、window通用文件解压

    在跨平台操作时,特别是涉及Linux和Windows系统的交互,理解如何在两种操作系统下进行通用的文件解压至关重要。本篇文章将详细介绍如何在Linux和Windows上解压兼容的压缩文件,特别是处理包含中文的压缩包。 首先,...

    Cython文件在window与linux下的编译指导

    Cython 文件在 window 与 linux 下的编译指导 Cython 文件在 window 与 linux 下的编译指导是指在不同的操作系统平台上编译 Cython 文件的指导。Cython 是一种高级语言,可以将 Python 代码编译成 C 代码,然后再...

    windows,linux下如何监听新建文件,复制文件,移动文件,剪切文件,修改文件.zip

    windows,linux下如何监听新建文件,复制文件,移动文件,剪切文件,修改文件.zip 监听文件修改事件,文件监控文件的新建,复制,修改,剪切,删除,修改操作 包括两个版本:windows版和linux版

    文件按照window 的排序规则-Java实现

    在Java中,可以使用`File[] listFiles()`方法获取目录下的所有文件,然后通过`Arrays.sort()`排序,但默认是区分大小写的。若要实现不区分大小写的排序,需自定义比较器: ```java Arrays.sort(files, new ...

    window 下打开linux 文件查看器

    标题中的“window 下打开linux 文件查看器”指的是在Windows操作系统中查看由Linux系统生成的文本文件。由于Linux和Windows在处理文本文件时采用的字符编码和行结束符可能不同,直接用Windows默认的记事本打开可能会...

    Linux下Java使用RXTX串口读写..包含window和linux文件

    window Copy RXTXcomm.jar ---&gt; &lt;JAVA_HOME&gt;\jre\lib\ext Copy rxtxSerial.dll ---&gt; &lt;JAVA_HOME&gt;\jre\bin Copy rxtxParallel.dll ---&gt; &lt;JAVA_HOME&gt;\jre\bin Linux Choose your binary build - x86_64 or i386 ...

    java调用window操作系统文本转语音并生成播放文件

    3. 使用`java.lang.Runtime.getRuntime().exec()` 或 `java.lang.ProcessBuilder` 调用DLL,传递文本和输出文件路径作为参数。 4. 在DLL中,调用`ISpVoice::Speak` 方法将文本转换为语音,并使用`ISpVoice::Set...

    unison双向同步文件工具可在linux下和window系统下

    Unison是一款强大的、跨平台的文件同步工具,它支持Linux和Windows操作系统,使得用户能够在不同系统之间方便地进行文件和目录的同步。Unison的独特之处在于它的双向同步功能,这意味着两个同步端的数据改动都可以被...

    java jdk 10 window与linux安装包

    这是一个压缩文件,需要先使用`tar -zxvf jdk-10_linux-x64_bin.tar.gz`命令解压。解压后,将JDK文件夹移动到合适的位置,如`/usr/lib/jvm`。然后,你需要手动设置`JAVA_HOME`环境变量,并更新`PATH`,确保系统可以...

    Java链接SAP JCO包 32位,window、linux

    本文将详细讲解如何在32位环境下在Java中设置和使用SAP JCO连接。 首先,了解SAP JCO的基本概念。SAP JCO是SAP提供的一个开源库,它基于RFC(Remote Function Call)协议,使得Java应用程序能够调用SAP R/3或ABAP ...

    window传输文件到本地linux虚拟机客户机的java程序

    标题中的“window传输文件到本地linux虚拟机客户机的java程序”指的是一个Java应用程序,它的主要功能是将Windows操作系统中的文件高效地传输到运行在本地的Linux虚拟机上。这个程序利用了Java的强大跨平台特性,...

    Java 中文字体修正包 For Linux

    适用范围: 当Linux下的图形化java应用无法显示汉字时(例如oracle、db2、websphere的安装、设置等应用),用这里提供的任意一个包都可解决。基于Linux的所有jdk、jre均适用(1.5以上版本)。 安装方法: 在jre/lib...

Global site tag (gtag.js) - Google Analytics