一个更改 hosts 的 PHP 脚本

有这样一个需求,我有多个网址希望在不同的时候对应不同的 ip,如果一个个配 hosts,这工作显得有些繁琐。写了如下脚本来批量更改。

<?php

define('HOST_FILE', 'C:\Windows\System32\drivers\etc\hosts');

$hm = new HostManage(HOST_FILE);

$env = $argv[1];
if (empty($env)) {
        $hm->delAllGroup();
} else {
        $hm->addGroup($env);
}

class HostManage {

        // hosts 文件路径
        protected $file;
        // hosts 记录数组
        protected $hosts = array();
        // 配置文件路径,默认为 __FILE__ . '.ini';
        protected $configFile;
        // 从 ini 配置文件读取出来的配置数组
        protected $config = array();
        // 配置文件里面需要配置的域名
        protected $domain = array();
        // 配置文件获取的 ip 数据
        protected $ip = array();

        public function __construct($file, $config_file = null) {
                $this->file = $file;
                if ($config_file) {
                    $this->configFile = $config_file;
                } else {
                    $this->configFile = __FILE__ . '.ini';
                }
                $this->initHosts()
                        ->initCfg();
        }

        public function __destruct() {
                $this->write();
        }

        public function initHosts() {
                $lines = file($this->file);
                foreach ($lines as $line) {
                        $line = trim($line);
                        if (empty($line) || $line[0] == '#') {
                                continue;
                        }
                        $item = preg_split('/\s+/', $line);
                        $this->hosts[$item[1]] = $item[0];
                }
                return $this;
        }

        public function initCfg() {
                if (! file_exists($this->configFile)) {
                        $this->config = array();
                } else {
                        $this->config = (parse_ini_file($this->configFile, true));
                }
                $this->domain = array_keys($this->config['domain']);
                $this->ip = $this->config['ip'];
                return $this;
        }

        /**
         * 删除配置文件里域的 hosts
         */
        public function delAllGroup() {
                foreach ($this->domain as $domain) {
                        $this->delRecord($domain);
                }
        }

        /**
         * 将域配置为指定 ip
         * @param type $env
         * @return \HostManage
         */
        public function addGroup($env) {
                if (! isset($this->ip[$env])) {
                        return $this;
                }
                foreach ($this->domain as $domain) {
                        $this->addRecord($domain, $this->ip[$env]);
                }
                return $this;
        }

        /**
         * 添加一条 host 记录
         * @param type $ip
         * @param type $domain
         */
        function addRecord($domain, $ip) {
                $this->hosts[$domain] = $ip;
                return $this;
        }

        /**
         * 删除一条 host 记录
         * @param type $domain
         */
        function delRecord($domain) {
                unset($this->hosts[$domain]);
                return $this;
        }

        /**
         * 写入 host 文件
         */
        public function write() {
                $str = '';
                foreach ($this->hosts as $domain => $ip) {
                        $str .= $ip . "\t" . $domain . PHP_EOL;
                }
                file_put_contents($this->file, $str);
                return $this;
        }

}

示例配置文件如下:

# 域名
[domain]
a.example.com=1 # 请无视这个 =1,因为使用了 parse_ini_file 这个函数来解析,如果后面不带值,就获取不到这条记录了
b.example.com=1
c.example.com=1

# ip 记录
[ip]
local=127.0.0.1
dev=192.168.1.100

使用方法:

php hosts.php local # 域名将指向本机 127.0.0.1
php hosts.php dev # 域名将指向开发机 192.168.1.100
php hosts.php # 删除域名的 hosts 配置

写完后,发现,这明明就是只需要一次查找替换就能完成的工作嘛

时间: 2024-10-10 22:23:47

一个更改 hosts 的 PHP 脚本的相关文章

一个检测应用状态的脚本

#!/bin/sh #Description:       Check ICE3.0 State #Last Update:       2014/06/11/01 WORKDIR=`pwd` export REPORTDIR=$WORKDIR/`date "+%Y%m%d%H%M%S"` export TG=`date "+%Y%m%d%H%M%S"` export BEGIN=`date -d "-1 hour" "+%H:%M:%

MSSQL-Scripter,一个新的生成T-SQL脚本的SQL Server命令行工具

这里向大家介绍一个新的生成T-SQL脚本的SQL Server命令行工具:mssql-scripter.它支持在SQL Server.Azure SQL DB以及Azure SQL DW中为数据库生成CREATE和INSERT T-SQL脚本. Mssql-scripter是一个跨平台的命令行工具,功能等同于SQL Server Management Studio中的Generate and Publish Scripts Wizard. 咱们能够在Linux.macOS和Windows上使用它

一个转换编码格式的VBS脚本

今天看到了一个转换编码格式的VBS脚本程序,但是只能转换2种,改造了一下,可以自己指定转换格式.支持: utf-8 ansi 或者是 gb2312 unicode 之间的相互转换.自动探测文件格式,手工指定输出格式,默认输出格式为utf-8.可以直接改变文件编码,也可以输出为另外的一个文件.支持强制覆盖选项. 用法为: cscript chcode.vbs inputfile.txt 会把inputfile.txt转换为utf-8格式编码 cscript chcode.vbs inputfile

Windows 2003/2008更改远程桌面端口脚本

保存为bat文件,点击运行按提示输入新端口自动完成,直接下载更改远程桌面端口脚本 @echo off color 0a title @@ 修改Windows XP/2003/2008远程桌面服务端口号 @@ echo ******************************************************************* echo * 请输入您要更改的远程桌面端口号,范围:1-65535,不能与其他端口冲突 * echo **********************

更新hosts的python脚本

#!/usr/bin/env python # -*- coding:utf-8 -*- #author:mrsimple import sys import urllib import os from shutil import copyfile HOSTS_URL='https://smarthosts.googlecode.com/svn/trunk/hosts' LOCAL_HOSTS='/etc/hosts' def update(): """update host

scapy编写简单的ARP扫描脚本 本课程基于 Python 的 scapy 模块编写,适合有 Python 基础的同学学习,最终完成一个简单的 ARP 扫描脚本。

scapy编写简单的ARP扫描脚本 本课程基于 Python 的 scapy 模块编写,适合有 Python 基础的同学学习,最终完成一个简单的 ARP 扫描脚本.

Ubuntu更改hosts档

Ubuntu更改hosts档 打开hosts档 sudo gedit /etc/hosts 下载hosts,并全选复制 hosts 粘贴到hosts文件里.保存就可以 版权声明:本文博主原创文章,博客,未经同意不得转载.

Linux shell中getopts命令学习--实现一个添加yum源的脚本

getopts是bash shell的内建命令,作用是在shell脚本中解析命令行传递.传递给函数或传递给另一个调用的shell脚本的位置参数(选项或参数,后面会讲解,getopts只支持短选项,若要解析长选项请参考getopt). getopts命令语法: getopts optstring name [arg] 相关的术语: 选项(option):GNU风格的命令选项,如:-x,-y等减号加上单个字母的为短选项:--help为长选项: 选项的参数:某些选项之后必须尾随参数,如:-f xxx.

每天一个JavaScript实例-从js脚本中访问object元素中的SVG

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>每天一个JavaScript实例-从js脚本中访问object元素中的SVG</title> <style> </style> </head> &l