切换hosts的shell脚本

在web开发中,我们经常需要切换hosts绑定,比较好用工具火狐插件:hostAdmin.

今天突发奇想(最近看了很多shell,也想锻炼一下),仿照hostAdmin写了一个shell脚本,目前运行良好。

#!/bin/bash

##############################
#  切换hosts的工具类 swich hosts
#
#  --------hosts 文件格式--------
#  ==offline
#  ip list...
#  ==offline
#
#  ==online
#  ip list...
#  ==online
#  --------hosts 文件格式--------
#  
#  操作:sh shosts.sh offline 开启offline这组host绑定
#
#  diaocow 2012-9-8
#
##############################

# 检测用户是否输入了group tag
if [[ -z $1 ]] ; then
        echo "Error: Please input a group tag! eg. offline"
        exit 1
fi

HOSTS="testdata"         # hosts文件(这里,你需要替换成/etc/hosts)
HOSTS_TEMP="host.tmp"    # hosts临时文件
GROUP_TAG="==$1"         # 需要打开的组

# 检测group tag有效性
if ! grep -q  "$GROUP_TAG"  "$HOSTS" ; then
        echo "Error: there is no group tag named $GROUP_TAG in $HOSTS"
        exit 1
fi

# 函数:判断字符串是否为IP
isIp() {
	echo $1 | grep -E -q '([0-9]+\.){3}[0-9]'
    ip_result=`echo $?`
}

# clean临时文件
: > $HOSTS_TEMP
# group tag 计数
start_flag=0

# 处理hosts
cat $HOSTS | while read line ; do

        if echo $line | grep -q $GROUP_TAG; then
                start_flag=$((start_flag + 1))
        fi

        isIp "$line"

        if [[ $start_flag == 1 && $ip_result == 0 ]] ; then
                # 去掉开头的注释符 
                line=${line/#\#/}
        elif [[ $ip_result == 0 ]] ; then
                # 在行开头添加注释符
                if ! echo $line | grep -q '^ *#' ; then
                     line=\#$line
                fi
        fi
        echo "$line" >> $HOSTS_TEMP

done

# 重新生成hosts
cat $HOSTS_TEMP > $HOSTS

rm -rf $HOSTS_TEMP

现在我们来测试下这个脚本:

我们准备下测试数据(脚本中的HOSTS变量指定hosts文件,目前我们暂定义为testdata):

[diaocow@ubuntu]$ cat testdata 
==offline
72.51.30.13    offline.test1.com 
72.20.123.321  offline.test2.com

==offline

==online
12.56.92.97 online.test1.com    
12.56.38.84 online.test2.com
==online

将host切换到线上环境

[diaocow@ubuntu]$ sh shosts.sh  online
[diaocow@ubuntu]$ cat testdata
==offline
#72.51.30.13    offline.test1.com
#72.20.123.321  offline.test2.com

==offline

==online
12.56.92.97 online.test1.com
12.56.38.84 online.test2.com
==online

重复执行shshosts.shonline不会有任何问题

我们在尝试切换成线下环境

[diaocow@ubuntu]$ sh shosts.sh  offline
[diaocow@ubuntu]$ cat testdata
==offline
72.51.30.13    offline.test1.com
72.20.123.321  offline.test2.com

==offline

==online
#12.56.92.97 online.test1.com
#12.56.38.84 online.test2.com
==online

一切OK

在脚本的编写过程中,我经常使用这两个命令

sh-nshosts.shonline#检测脚本语法错误

sh-xshosts.shonline#详细打出脚本每一步执行过程

相关推荐