1. 背景
前段时间在公司服务器搭建了 OpenVPN 服务器,用来远程连接公司服务器中的虚拟机。因为没有搭建配套的管理端网页界面,每次遇到创建新用户或者删除用户凭证的时候,都需要手动操作,每次都是在进行重复操作,很繁琐。
这两天趁着还有些时间,通过 Shell 脚本 + Bat 脚本实现了创建用户、删除用户的自动化操作,仅需要点击 Bat 脚本即可,并且该脚本自动会将访问 OpenVPN 的相关文件从服务器拷贝至当前机器上,大大较少了复杂的操作逻辑。
2. 关键点
2.1 Shell 脚本自动填入用户名和密码
如果使用命令行来为 OpenVPN 添加用户,通常使用命令./easyrsa build-client-full <user_name>,然后根据提示依次键入用户凭证。如果想通过 Shell 脚本来实现这一步骤,那么就需要在脚本中实现上述过程的自动化处理。
Linux 操作系统中支持 expect 脚本,可通过 spawn 命令启动一个新的交互式线程,然后通过 send 命令向这个线程发送命令或输入。expect 是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
expect 自动交互流程如下:
1. spawn 启动指定的进程
2. expect 获取指定关键字
3. send 向指定程序发送特定字符
4. 执行完成退出
核心代码:
# 使用expect执行build-client-full命令并设置密码
expect << EOF
spawn ./easyrsa build-client-full $1
expect "Enter PEM pass phrase:"
send "$2\r"
expect "Verifying - Enter PEM pass phrase:"
send "$2\r"
expect eof
EOF
2.2 Bat 脚本执行 Shell 脚本并传入参数
Bat 脚本执行 Shell 脚本依靠 Putty 中的 plink 命令来实现,核心命令如下:
plink -batch %USERNAME%@%HOST% -pw %PASSWORD% "bash -s" < %CREATE_SCRIPT_PATH% %NAME% %PW%
其中:
- USERNAME:表示 OpenVPN 服务器的用户名
- HOST:表示 OpenVPN 服务器的 IP 地址
- PASSWORD:表示 OpenVPN 服务器用户名对应的密码
- CREATE_SCRIPT_PATH:表示 Shell 脚本在你当前系统上的文件路径,而不是在 OpenVPN 服务器上的文件路径
- NAME:表示需要创建用户的名称
- PW:表示对应的密码
3. 脚本操作
3.1 运行环境
- 操作系统:Windows 11
- 网络环境:Windows 系统需要能够和 OpenVPN 服务器直接通信
- 软件环境:Putty,并将 Putty 的安装路径添加到 PATH 路径中,能够保证 plink、pscp 命令全局可访问到
3.2 文件结构
3.3 操作步骤
3.3.1 创建用户
双击 create.bat 文件,然后根据提示依次键入用户名(只接受英文)和对应的密码(最少4位)。
用户创建成功后,会在当前目录下自动创建同名的文件夹,并将连接 OpenVPN 时所需的文件自动拷贝到该文件夹内部。
3.3.2 删除用户
双击 delete.bat 文件,然后根据提示键入用户名。