昔我往矣

dhcpd服务器添加主机MAC地址脚本

2013年03月22日

最近开始负责公司办公网络的dhcp服务器管理,主要职责就是谁的电脑要上网都要找我注册一下,把mac地址加入到dhcp服务器的配置文件/etc/dhcpd.conf中,而且还要先备份,再修改,再重启。对这种重复性操作一向深恶痛绝,所以琢磨了一下,写个脚本,每次输入hostname 和 mac地址就直接开始备份,添加,重启操作,岂不痛快?

现在每次都是一句话搞定所有步骤,十分轻松。下面就是整个脚本的内容了,有需要的同仁尽管拿去用吧。
一般dhcpd.conf的配置文件如下格式:

default-lease-time 21600;
max-lease-time 43200;
group {
host test { hardware ethernet 12:12:12:12:12:12 ; }
...
host test-again { hardware ethernet aa:aa:aa:aa:aa:aa; }
}
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option domain-name-servers 192.168.1.2;
range range 192.168.1.3 192.168.1.254;
}

每次有新的机器要加入到内网中都要在group里面添加一行主机的mac记录,操作有三步:备份、修改、加载。下面的脚本简化了这三部操作。

#!/bin/bash

# Add a Mac Address to the /etc/dhcpd.conf 
# date 20130321 by lhzhi

FILE_DIR=/etc/                

if [ ! $# -eq 2 ] ;              #需要两个参数,一个是hostname,一个是MAC地址
then
    echo "This script need 2 argument"      #服务器上没中文环境,所以提示都是英文
    echo "Usage: $0 host-name mac_address"    #用department-name作为主机名识别
    exit 
else
    DEPART=$1                  #Department name is hostname
    MAC_ADDR=$2                #Mac address   
fi

is_mac(){
    len1=`echo $1 | awk -F: '{print NF}'`   #截取出来的段数
    len2=`echo $1 | awk -F: '{i=1;while(i<=NF){if($i ~/^[0-9a-fA-F][0-9a-fA-F]$/) {print $i} i++}}' | wc -l`   #awk正则表达式匹配内容。
    if [ $len1 -eq $len2 ] && [ $len1 -eq 6 ] && [ ${#1} -eq 17 ] ; then  #很傻冒的办法,看不懂说明您已经是高等人类,大脑自动屏蔽了这种恶心的办法
        echo 'mac is valid'     
    else
        echo "mac address is invilide,please check it before try again"
        exit
    fi
}
is_mac $MAC_ADDR    #is this mac address invilide

if [ ! -f ${FILE_DIR}dhcpd.conf ];then
    echo "Error:${FILE_DIR}dhcpd.conf is not exist,check it first"      #检查/etc/dhcpd.conf是否存在,没有的话可能是你登录错服务器了,或者是出大问题了
    exit
fi
Low_MAC_ADDR=`echo $MAC_ADDR | tr A-Z a-z`      
UPP_MAC_ADDR=`echo $MAC_ADDR | tr a-z A-Z`  #MAC地址可能是大写也可能是小写,如果你是在同一个MAC地址中既大写又小写,请您绕道吧

if grep $Low_MAC_ADDR ${FILE_DIR}dhcpd.conf || grep $Low_MAC_ADDR ${FILE_DIR}dhcpd.conf || awk '/^host/{print $2}' ${FILE_DIR}dhcpd.conf |  grep ^${DEPART}$ ;then     #继续走二货路线
    echo 'this record is already exist.'
    exit
else
    echo 'it is a new user'
fi

BACKUP_FILENAME=${FILE_DIR}dhcpd.conf.backup`date +%Y%m%d%H%M%S`     #先备份配置文件
ADD_LINE="host    $DEPART     {  hardware ethernet                $MAC_ADDR   ;   }"     #构造要插入的行

cp ${FILE_DIR}dhcpd.conf $BACKUP_FILENAME               #先备份配置文件

if [ $? -eq 0 ];
then
    LAST_MAC=`sed -n '/^host/h;${x;p}' ${FILE_DIR}dhcpd.conf | awk '{print $6}'`   #获取最后一行host的mac地址,  
    sed -i "/${LAST_MAC}/a\\${ADD_LINE}" ${FILE_DIR}dhcpd.conf     #将新的mac地址插到这一行的下面
fi

if [ $? -eq 0 ];
then
    /etc/init.d/dhcpd reload && echo "dhcpd reload ok..."     #重启,收工
fi

这脚本确实不够优雅,如果各位看官有什么更高明的办法,还望不吝赐教~
将脚本保存为ADDIP.sh文件,下面就可以开始测试了,

# bash ADDIP.sh ops-lhzhi ab:ab:ab:ab:ab:ab

看看你的/etc/dhcpd.conf中是不是已经有了一个新DHCP客户机的mac地址呢?
其实这个脚本功能还不是很完善
1.如果有一台客户机要给一个固定IP,就需要使用fixed-address ip 这种语句,但是现在也没遇到这种情况,所以先不考虑这个问题了
2.不能删除MAC记录,文件中已经四百多个MAC记录了,但是一般在线人数只有不到一百人,大量的离职员工MAC地址没清除掉,十分不利于管理。
一切等有需求了再说!

当前暂无评论 »

添加新评论 »