Akemi

Shell脚本-添加Openvpn账号密码

2024/12/11

使用账号密码登录的Openvpn,使用shell进行管理
对分配的IP进行查找重复等

交互式
傻瓜式的,易用

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
#!/bin/bash

CDD_DIR=/etc/openvpn/ccd
DIR=/etc/openvpn
PASS_FILE=$DIR/pass_file

function list_used_ip {
rm -rf "$DIR/ip_list.txt"
find "$CDD_DIR" -type f | while read -r file; do
awk -v filename="${file##*/}" '{print $2,filename}' "$file" >> "$DIR/ip_list.txt"
done
sort -n -k1,1 -t' ' "${DIR}/ip_list.txt" > "${DIR}/ip_list_sort.txt"
}

while true
do
list_used_ip
echo "
==========================分配openvpn账号密码脚本==========================
1.列出已使用ip列表
2.添加新车辆与ip
========================================================================
"
read -p "请输入数字或exit退出脚本:" num
case $num in
1)
echo "已使用ip列表:"
cat "$DIR/ip_list_sort.txt"
;;
2)
read -p "请输入车辆名称:" car_name
# 判断车辆名是否只包含字母和数字
if [[ ! $car_name =~ ^[A-Za-z0-9]+$ ]]; then
echo "车辆名含有非法字符,请重新输入"
continue
fi
# 车辆名如果不以car开头,则自动添加car前缀
if [[ ! $car_name =~ ^car ]]; then
car_name="car$car_name"
fi

read -p "请输入分配的ip地址:" car_ip
# 判断ip是否合法
if [[ ! $car_ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
echo "ip地址不合法,请重新输入"
continue
fi
# 判断ip是否属于合法网段
if [[ $car_ip != 192.168.1.* ]]; then
echo "ip地址网段不合法,请重新输入"
continue
fi
# 判断ip是否存在
if grep -q "$car_ip" "$DIR/ip_list_sort.txt"; then
echo "该ip已存在,请查询后重新输入"
continue
else
echo "该ip可用
请确认车辆名和ip地址:
车辆名为$car_name
ip地址为$car_ip
输入yes确认,输入no重新输入"
read -p "请输入yes或no:" confirm
if [[ $confirm == "yes" ]]; then
# 判断车辆名在pass_file中是否存在
sed -i "/^${car_name} 123456$/d" "$PASS_FILE"
echo "$car_name 123456" >> "$PASS_FILE"
# 添加车辆名和ip到ccd目录
rm -rf "$CDD_DIR/$car_name"
echo "ifconfig-push $car_ip 255.255.255.0" >> "$CDD_DIR/$car_name"
echo "添加成功"
else
echo "重新输入"
continue
fi
fi
;;
"exit"|exit)
break
;;
*)
echo "无效,请重新输入"
;;
esac
done

非交互式传参

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
#!/bin/bash

CDD_DIR=/etc/openvpn/ccd
DIR=/etc/openvpn
PASS_FILE=$DIR/pass_file

function list_used_ip {
rm -rf "$DIR/ip_list.txt"
find "$CDD_DIR" -type f | while read -r file; do
awk -v filename="${file##*/}" '{print $2,filename}' "$file" >> "$DIR/ip_list.txt"
done
awk '{print $2, $1}' "${DIR}/ip_list.txt" | sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4 | awk '{print $2, $1}' > "${DIR}/ip_list_sort.txt"
}

list_used_ip
case $1 in
"list")
echo "已使用ip列表:"
cat "$DIR/ip_list_sort.txt"
;;
"add")
if [ $# -ne 3 ]; then
echo "缺少参数,请输入车辆名和ip地址"
exit 1
fi
# 判断车辆名是否只包含字母和数字
if [[ ! $2 =~ ^[A-Za-z0-9]+$ ]]; then
echo "车辆名含有非法字符,请重新输入"
exit 1
fi
# 判断ip是否合法
if [[ ! $3 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
echo "ip地址格式不合法,请重新输入"
exit 1
fi
# 判断ip是否属于合法网段
if [[ $3 != 192.168.1.* ]]; then
echo "ip地址网段不合法,请重新输入"
exit 1
fi
# 判断ip是否存在
if grep -q -w "$3" "$DIR/ip_list_sort.txt"; then
echo "该ip已存在,请查询后重新输入"
exit 1
fi
# 车辆名如果不以car开头,则自动添加car前缀
if [[ ! $2 =~ ^car ]]; then
car_name="car$2"
sed -i "/^${car_name} 123456$/d" "$PASS_FILE"
echo "${car_name} 123456" >> "$PASS_FILE"
rm -rf "$CDD_DIR/$car_name"
echo "ifconfig-push $3 255.255.255.0" >> "$CDD_DIR/$car_name"
echo "添加成功"
exit 0
fi

# 判断车辆名在pass_file中是否存在
sed -i "/^$2 123456$/d" "$PASS_FILE"
echo "$2 123456" >> "$PASS_FILE"
# 添加车辆名和ip到ccd目录
rm -rf "$CDD_DIR/$2"
echo "ifconfig-push $3 255.255.255.0" >> "$CDD_DIR/$2"
echo "添加成功"

;;
"help")
echo "./openvpn-manager.sh <parameter>
list -- show add used ip
add <car_name> <ip> -- add car name and ip
--help -- show help
"
;;
*)
echo "unknown parameter
--help -- show help"
;;
esac
CATALOG