用Linux Shell脚本轻松管理Radius服务器

公司的无线环境采用mac地址认证的方式,mac地址被绑定到Radius的users配置文件中,将注册了的mac地址作为用户名和密码。为了方便的管理这些mac地址,自己写了一个shell脚本来管理。

shell脚本所特有的强大文本处理能力和各种命令函数的组合,使得管理员的工作能轻松不少。

下面就列出该脚本的功能以示参考:

  1. 添加mac地址
  2. 删除mac地址
  3. 查找mac地址
  4. 去除重复mac地址
  5. 检查mac地址合法性
  6. TODO,导入导出mac地址,添加注释

其中用到的Shell脚本技术包括但不限于:

  1. 文本文件的列处理和行处理,如sed、awk等命令
  2. 字符串查找、过滤、大小写转换,bash和grep等命令
  3. 获取、计算、比较字符串长度,bash和wc等命令
  4. mac地址正则表达式的处理和类型转换
  5. shell编程操作、包括文件包含、函数、参数传递、返回值等
  6. 其他

代码示例:

#!/bin/bash
#

# Source function library.
. /etc/rc.d/init.d/functions

RADIUSD=/usr/sbin/radiusd
LOCKF=/var/lock/subsys/radiusd
CONFIG=/etc/raddb/radiusd.conf
USERCONFIG=/etc/raddb/users

[ -f $RADIUSD ] || exit 0
[ -f $CONFIG ] || exit 0
[ -f $USERCONFIG ] || exit 0

RETVAL=0

OPERATION=$1
MACADDRESS=$2

function help()
{
	clear
	echo $""
	echo $"===================================================================================="
	echo $"For Radius on Fedora/CentOS/RadHat Linux Server, Written by Chris"
	echo $"===================================================================================="
	echo $"A tool to manage Radius server"
	echo $""
	echo $"Usage: $0 {find|add|modify|delete|check|remove|start|stop|status|restart|reload} mac"
	#TODO
	echo $"Usage: $0 {import|export|debug}"
	echo $""
	echo $"For more information please contract [email protected]"
	echo $"===================================================================================="
	echo $""
	exit 1
}

function mac()
{
	if [ -z $MACADDRESS ];then
		echo $"no mac address is signed! "
		echo $"\$2 is $MACADDRESS"
		exit 1
	else
                if [[ "${#MACADDRESS}" != "12" ]] && [[ "${#MACADDRESS}" != "17" ]] ;then
			echo "mac length is ${#MACADDRESS}"
                        echo "mac address is illegal! "
			exit 1
#                else
#                        echo $"mac which you input is $MACADDRESS"
                fi
		#echo $MACADDRESS | sed -nr ‘/[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}/p‘
		#echo $MACADDRESS | sed -nr ‘/[A-Fa-f0-9]{2}-[A-Fa-f0-9]{2}-[A-Fa-f0-9]{2}-[A-Fa-f0-9]{2}-[A-Fa-f0-9]{2}-[A-Fa-f0-9]{2}/p‘
		#echo $MACADDRESS | sed -nr ‘/[A-Fa-f0-9]{12}/p‘
		if [[ `echo $MACADDRESS | grep -` ]];then
			PROMAC=`echo $MACADDRESS | sed -nr ‘/[A-Fa-f0-9]{2}-[A-Fa-f0-9]{2}-[A-Fa-f0-9]{2}-[A-Fa-f0-9]{2}-[A-Fa-f0-9]{2}-[A-Fa-f0-9]{2}/p‘ | tr ‘[:upper:]‘ ‘[:lower:]‘ | sed ‘s/-//g‘`
		elif [[ `echo $MACADDRESS | grep :` ]];then
			PROMAC=`echo $MACADDRESS | sed -nr ‘/[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}:[A-Fa-f0-9]{2}/p‘ | tr ‘[:upper:]‘ ‘[:lower:]‘ | sed ‘s/://g‘`
		else
			PROMAC=`echo $MACADDRESS | tr ‘[:upper:]‘ ‘[:lower:]‘`
		fi
		echo $PROMAC
	fi
}

function find()
{
	MAC=`mac`
	echo $"accepted mac is $MAC"
	if [[ `grep $MAC $USERCONFIG` ]]; then
		MACLINE=`grep -n $MAC $USERCONFIG | awk -F ‘:‘ ‘{print $1}‘`
		#echo $MACLINE
		MACLINECOUNT=$(echo $MACLINE | wc -w)
		#echo $MACLINECOUNT
		if [[ "$MACLINECOUNT" != "1" ]];then
			echo $"ERROR, this mac $MAC has duplicate record, you should use $0 remove $MAC to remove duplicate record"
			exit 1
		fi
		echo $"Successfully find $MAC in $MACLINE line of file $USERCONFIG! "
		echo
		REVAL=$?
	else
		echo $"Can not find $MAC in file $USERCONFIG! "
		echo
		exit 1
		REVAL=$?
	fi
}

function add()
{
	MAC=`mac`
	echo $"accepted mac is $MAC"
	#find $MAC
	LINENUM=`grep -n "Cleartext-Password :=‘" users | grep -v \# | head -n1 | awk -F ":" ‘{print $1}‘`
	SEDOPERATION=$LINENUM"a"
	sed -i "$SEDOPERATION $MAC    Cleartext-Password :=‘$MAC‘" $USERCONFIG
	find $MAC
	restart
}

function modify()
{
	MAC=`mac`
	find $MAC
	#TODO

}

function delete()
{
        MAC=`mac`
        echo $"accepted mac is $MAC"
        if [[ `grep $MAC $USERCONFIG` ]]; then
                MACLINE=`grep -n $MAC $USERCONFIG | awk -F ‘:‘ ‘{print $1}‘`
                ##echo $MACLINE
                #MACLINECOUNT=$(echo $MACLINE | wc -w)
                ##echo $MACLINECOUNT
                #if [[ "$MACLINECOUNT" != "1" ]];then
                #        echo $"ERROR, this mac $MAC has duplicate record, you should use $0 remove $MAC to remove duplicate record"
                #        exit 1
                #fi
                echo $"Successfully find $MAC in $MACLINE line of file $USERCONFIG! "
		echo $"It will be deleted! "
		sed -i "$MACLINE d" $USERCONFIG
		#TODO
		echo $"If you see ‘Can not find $MAC in file $USERCONFIG! ‘, it means successfully! "
		find $MAC
                echo
                REVAL=$?
        else
                echo $"Can not find $MAC in file $USERCONFIG! "
                echo
                REVAL=$?
        fi
}

function check()
{
	MAC=`mac`
	find $MAC
	remove $MAC
}

function remove()
{
	MAC=`mac`
        echo $"accepted mac is $MAC"
	#TODO
	#echo $"backuped file to file $FILENAME"
        if [[ `grep $MAC $USERCONFIG` ]]; then
                MACLINE=`grep -n $MAC $USERCONFIG | awk -F ‘:‘ ‘{print $1}‘`
                #echo $MACLINE
                MACLINECOUNT=$(echo $MACLINE | wc -w)
                #echo $MACLINECOUNT
                if [[ "$MACLINECOUNT" == "1" ]];then
                        echo $"WARNNING, this mac $MAC is good record, no duplicate record has found! "
                        exit 0
                fi
	TOREMOVE="$MAC    Cleartext-Password :=‘$MAC‘"
	sed -i "/^$TOREMOVE$/d" $USERCONFIG
	add $MAC
	fi
}

function restart()
{
	service radiusd restart
}

function reload()
{
	service radiusd reload
}

function status()
{
	service radiusd status
}

case "$1" in 
	find)
		find
		RETVAL=$?
	;;
	add)
		add
		RETVAL=$?
	;;
	modify)
		modify
		RETVAL=$?
	;;
	delete)
		delete
		RETVAL=$?
	;;
	check)
		check
		RETVAL=$?
	;;
	remove)
		remove
		RETVAL=$?
	;;
	start)
		start
		RETVAL=$?
	;;
	stop)
		stop
		RETVAL=$?
	;;
	status)
		status
		RETVAL=$?
	;;
	restart)
		restart
		RETVAL=$?
	;;
	reload)
		reload
		RETVAL=$?
	;;
	*)
		help
		exit 1
	;;
esac

其中有一些可以改进的地方,比如换一种方法或者增强用户的使用体验都是可以的,欢迎大家提出意见。

时间: 2024-10-13 19:27:49

用Linux Shell脚本轻松管理Radius服务器的相关文章

Linux shell脚本判断服务器网络是否可以上网

Linux shell脚本判断网络畅通 介绍 在编写shell脚本时,有的功能需要确保服务器网络是可以上网才可以往下执行,那么此时就需要有个函数来判断服务器网络状态 我们可以通过curl来访问 www.baidu.com,从而判断服务器网络状态是否可以畅通的 网络状态判断 #!/bin/bash #检测网络链接畅通 function network() { #超时时间 local timeout=1 #目标网站 local target=www.baidu.com #获取响应状态码 local

Linux Shell脚本编程学习笔记和实战

http://www.1987.name/141.html shell基础 终端打印.算术运算.常用变量 Linux下搜索指定目录下特定字符串并高亮显示匹配关键词 从键盘或文件中获取标准输入 [read命令] 文件的描述符和重定向 数组.关联数组和别名使用 函数的定义.执行.传参和递归函数 条件测试操作与流程控制语句 获取时间日期格式和延时 [date.sleep命令] 内部字段分隔符IFS和脚本的调试DEBUG 显示.读取或拼接文件内容 [cat命令] 文件查找与打印文件列表 [find命令]

LINUX SHELL脚本攻略笔记[速查]

Linux Shell脚本攻略笔记[速查] 资源 shell script run shell script echo printf 环境变量和变量 pgrep shell数学运算 命令状态 文件描述符和重定向 cat 数组和关联数组 alias date 调试脚本 函数和参数 管道 读取命令输出 read 字段分隔符和迭代器 循环 比较和测试 find xargs tr md5sum sha1sum 对目录进行校验 sort uniq tempfile split bash变量匹配切分 exp

Linux Shell脚本之Gitlab远程备份

注:Gitlab是一个git服务程序,有web图形界面和一系列管理工具,具体详细介绍可以Google it. 这一篇可以说是上一篇<Linux Shell脚本之Atlassian confluence远程备份方法>的姊妹篇.其说明和原理是和上一篇是一样的,其核心原理都是core dump.scp.ssh和find+rm,但也有不同. 1.Gitlab本身提供了较好的备份方法,只是一个命令那么简单,并且它也支持远程备份(远程存储和云存储),例如它可以存储到aws的s3上. 2.本脚本运行在Git

Linux shell脚本基础学习详细介绍(完整版)一

Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Linux 脚本编写基础◆1.1 语法基本介绍 1.1.1 开头 程序必须以下面的行开始(必须方在文件的第一行): #!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序.在这个例子中我们使用/bin/sh来执行程序. 当编辑好脚本时,如果要执行该脚本,还必须使其可执行. 要使脚本可执

Linux Shell脚本例子

Shell脚本是我们运维人员管理的最基础知识,下面就是我在学习过程中的一些小例子(比起大牛来说).写这篇博客的目的,是为了记录自己学习脚本的历程,也是为了能和读者一起探讨学习. # Example1: 自动创建脚本的模板 脚本名:creat_scripts.sh  # 功能描述:creat_scripts.sh SCRIPTS_NAME 如果创建的脚本名文件不存在,则创建成脚本文件; # 如果对应的文件存在,且为脚本文件,则打开文件到最后一行: # 如果对应的文件存在,但不是脚本文件,则提示退出

第9章:Shell脚本进程管理

第9章:Shell脚本进程管理 9.1.进程概念 理解进程概念需要先简单了解指令和程序这两个概念,进程跟指令和程序是相关联的. 什么叫指令? 指令是指示计算机执行某种操作的命令,它由一串二进制数码组成. 什么叫程序? 程序(Program)是实现计算机执行一个或多个操作,或执行某一任务,按序设计的计算机指令的集合. 什么叫进程? 进程是正在运行的程序的实例,进程也是执行程序的具体实现过程. 指令.程序和进程三者之间的关系? 计算机实际上可以做的事情实质上非常简单,比如计算两个数的和,再比如在内存

老李分享:《Linux Shell脚本攻略》 要点(六)

老李分享:<Linux Shell脚本攻略> 要点(六) 1.打印网络接口列表 [[email protected] touch_more]# ifconfig | cut -c-10 | tr -d ' ' | tr -s '\n'eth0lo //cut -c-10 ;  输出前10个字符; //tr -d ' ' ;      删除所有空格; //tr -s '\n';     压缩重复的换行符 2.查看名字服务器 [[email protected] touch_more]# cat

Linux Shell脚本教程

v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} Normal 0 false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {