用Linux Shell腳本輕鬆管理Radius服務器

公司的無線環境採用mac地址認證的方式,mac地址被綁定到Radius的users配置文件中,將註冊了的mac地址做爲用戶名和密碼。爲了方便的管理這些mac地址,本身寫了一個shell腳原本管理。正則表達式

shell腳本所特有的強大文本處理能力和各類命令函數的組合,使得管理員的工做能輕鬆很多。shell

下面就列出該腳本的功能以示參考:編程

  1. 添加mac地址bash

  2. 刪除mac地址ide

  3. 查找mac地址函數

  4. 去除重複mac地址this

  5. 檢查mac地址合法性spa

  6. TODO,導入導出mac地址,添加註釋debug

其中用到的Shell腳本技術包括但不限於:rest

  1. 文本文件的列處理和行處理,如sed、awk等命令

  2. 字符串查找、過濾、大小寫轉換,bash和grep等命令

  3. 獲取、計算、比較字符串長度,bash和wc等命令

  4. mac地址正則表達式的處理和類型轉換

  5. shell編程操做、包括文件包含、函數、參數傳遞、返回值等

  6. 其餘

代碼示例:

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

其中有一些能夠改進的地方,好比換一種方法或者加強用戶的使用體驗都是能夠的,歡迎你們提出意見。

相關文章
相關標籤/搜索