远程更新windows服务上hosts文件

本文涉及的产品
.cn 域名,1个 12个月
简介: 远程更新windows服务上hosts文件

在liunx服务器上进行更新某windows服务器的hosts文件, 看起来有点难度。但经过我一番思考, 是这样的。

就是在要修改的远程windows客户端起个服务,  暴露自己接口, 更新对应的文件内容。


更新文件的代码如下, 大概的逻辑就是, 将要修改的文件读取出来,然后判断要写入的内容是否存在该文件中,若是存在该内容,则修改对应的内容,hosts文件内容都是ip对应着相应的域名,  只要获取到对应的ip和域名做对应的更新修改就好了。

/**
     * 获取host文件路径
     *
     * @return
     */
    public static String getHostFile() {
        String fileName = null;
        // 判断系统
        if ("linux".equalsIgnoreCase(System.getProperty("os.name"))) {
            fileName = "/etc/hosts";
        } else {
            fileName = System.getenv("windir") + "\\system32\\drivers\\etc\\hosts";
            // fileName = "C:\\selenium\\hosts";
            // fileName = "D:\\MacOs\\hosts";
        }
        return fileName;
    }

 

/**
     * 根据输入IP和Domain,更新host文件中的某个host配置
     *
     * @param ip
     * @param domain
     * @return
     */
    public synchronized static boolean updateHost(String ip, String domain) {
        if (ip == null || ip.trim().isEmpty() || domain == null || domain.trim().isEmpty()) {
            throw new IllegalArgumentException("ERROR:ip & domain must be specified");
        }
        String splitter = " ";
        /**
         * Step1: 获取host文件
         */
        String fileName = getHostFile();
        List<?> hostFileDataLines = null;
        try {
            hostFileDataLines = FileUtils.readLines(new File(fileName));
        } catch (IOException e) {
            System.out.println("Reading host file occurs error: " + e.getMessage());
            return false;
        }
        /**
         * Step2: 解析host文件,如果指定域名不存在,则追加,如果已经存在,则修改IP进行保存
         */
        List<String> newLinesList = new ArrayList<String>();
        // 指定domain是否存在,如果存在,则不追加
        boolean findFlag = false;
        // 标识本次文件是否有更新,比如如果指定的IP和域名已经在host文件中存在,则不用再写文件
        boolean updateFlag = false;
        for (Object line : hostFileDataLines) {
            String strLine = line.toString();
            // 将host文件中的空行或无效行,直接去掉
            if (StringUtils.isEmpty(strLine) || strLine.trim().equals("#")) {
                continue;
            }
            if (!strLine.startsWith("#")) {
                int index = strLine.indexOf(domain);
                // 如果行字符可以匹配上指定域名,则针对该行做操作
                if (index != -1) {
                    // 如果之前已经找到过一条,则说明当前line的域名已重复,
                    // 故删除当前line, 不将该条数据放到newLinesList中去
                    if (findFlag) {
                        updateFlag = true;
                        continue;
                    }
                    // 不然,则继续寻找
                    String[] array = strLine.trim().split(splitter);
                    for (int i = 1; i < array.length; i++) {
                        if (!domain.equalsIgnoreCase(array[i])) {
                            continue;
                        } else {
                            // domain 相同, ip不同
                            findFlag = true;
                            if (!array[0].equals(ip)) {
                                // IP不同,将匹配上的domain的ip 更新成设定好的IP地址
                                StringBuilder sb = new StringBuilder();
                                sb.append(ip).append(splitter);
                                for (int j = 1; i < array.length; i++) {
                                    sb.append(array[j]);
                                }
                                strLine = sb.toString();
                                updateFlag = true;
                            }
                        }
                    }
                }
            }
            // 如果有更新,则会直接更新到strLine中去
            // 故这里直接将strLine赋值给newLinesList
            newLinesList.add(strLine);
        }
        /**
         * Step3: 如果没有任何Host域名匹配上,则追加
         */
        if (!findFlag) {
            newLinesList.add(new StringBuilder(ip).append(splitter).append(domain).toString());
        }
        /**
         * Step4: 不管三七二十一,写设定文件
         */
        if (updateFlag || !findFlag) {
            try {
                FileUtils.writeLines(new File(fileName), newLinesList);
            } catch (IOException e) {
                System.out.println("Updating host file occurs error: " + e.getMessage());
                return false;
            }
        }
        return true;
    }

修改文件的接口放在远程服务器, 进行启动,暴露对应的接口。在服务端进行调用执行,做对应的修改更新。

目录
相关文章
|
13天前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
2月前
|
边缘计算 安全 网络安全
|
2月前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
97 9
|
2月前
|
应用服务中间件 Apache Windows
免安装版的Tomcat注册为windows服务
免安装版的Tomcat注册为windows服务
128 3
|
2月前
|
Java 关系型数据库 MySQL
java控制Windows进程,服务管理器项目
本文介绍了如何使用Java的`Runtime`和`Process`类来控制Windows进程,包括执行命令、读取进程输出和错误流以及等待进程完成,并提供了一个简单的服务管理器项目示例。
40 1
|
2月前
|
存储 开发框架 .NET
Windows IIS中asp的global.asa全局配置文件使用说明
Windows IIS中asp的global.asa全局配置文件使用说明
39 1
|
2月前
|
Java Windows
如何在windows上运行jar包/JAR文件 如何在cmd上运行 jar包 保姆级教程 超详细
本文提供了一个详细的教程,解释了如何在Windows操作系统的命令提示符(cmd)中运行JAR文件。
993 1
|
2月前
|
弹性计算 关系型数据库 网络安全
阿里云国际版无法连接和访问Windows服务器中的FTP服务
阿里云国际版无法连接和访问Windows服务器中的FTP服务
|
2月前
|
程序员 Windows
程序员必备文件搜索工具 Everything 带安装包!!! 比windows自带的文件搜索快几百倍!!! 超级好用的文件搜索工具,仅几兆,不占内存,打开即用
文章推荐了程序员必备的文件搜索工具Everything,并提供了安装包下载链接,强调其比Windows自带搜索快且占用内存少。
48 0
|
3月前
|
Windows
7-3|windows删除目录下的所有文件的命令
7-3|windows删除目录下的所有文件的命令