公司的無線環境採用mac地址認證的方式,mac地址被綁定到Radius的users配置文件中,將註冊了的mac地址做爲用戶名和密碼。爲了方便的管理這些mac地址,本身寫了一個shell腳原本管理。正則表達式
shell腳本所特有的強大文本處理能力和各類命令函數的組合,使得管理員的工做能輕鬆很多。shell
下面就列出該腳本的功能以示參考:編程
添加mac地址bash
刪除mac地址ide
查找mac地址函數
去除重複mac地址this
檢查mac地址合法性spa
TODO,導入導出mac地址,添加註釋debug
其中用到的Shell腳本技術包括但不限於:rest
文本文件的列處理和行處理,如sed、awk等命令
字符串查找、過濾、大小寫轉換,bash和grep等命令
獲取、計算、比較字符串長度,bash和wc等命令
mac地址正則表達式的處理和類型轉換
shell編程操做、包括文件包含、函數、參數傳遞、返回值等
其餘
代碼示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
|
#!/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 dgdenterprise@gmail.com"
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
|
其中有一些能夠改進的地方,好比換一種方法或者加強用戶的使用體驗都是能夠的,歡迎你們提出意見。