
首先安装一下相关依赖
apt install -y jq
安装好以来后把脚本写好
vim /etc/openvpn/scripts/vpn-notify.sh
#!/bin/bash
# --- 配置区 ---
BARK_KEY="" # 替换为你的 Bark Key
BARK_URL=""
# --- 获取 OpenVPN 传递的环境变量 ---
# $common_name: 客户端证书名称
# $trusted_ip: 客户端公网 IP
# $ifconfig_pool_remote_ip: 分配给客户端的虚拟 IP
# $script_type: 触发脚本的类型 (client-connect 或 client-disconnect)
# 确保脚本有正确的字符编码(避免中文乱码)export LANG=zh_CN.UTF-8
# 获取当前时间
TIME=$(date '+%Y-%m-%d %H:%M:%S')
# 拼接消息内容(区分上线 / 下线)if [ "$script_type" == "client-connect" ]; then
TITLE="VPN 设备上线"
# 拼接详细内容,保留空格分隔
BODY="用户:$common_name 公网 IP:$trusted_ip 分配 IP:$ifconfig_pool_remote_ip 时间:$TIME"
elif [ "$script_type" == "client-disconnect" ]; then
TITLE="VPN 设备下线"
BODY="用户:$common_name 公网 IP:$trusted_ip 时长:${daemon_start_time:- 未知} 至今 时间:$TIME"
else
echo "未知的脚本类型: $script_type"
exit 0
fi
ENCODED_TITLE=$(echo -n "$TITLE" | xargs -I {} printf '%s' {} | jq -sRr @uri)
ENCODED_BODY=$(echo -n "$BODY" | xargs -I {} printf '%s' {} | jq -sRr @uri)
FINAL_URL="${BARK_URL}/${ENCODED_TITLE}/${ENCODED_BODY}?group=OpenVPN&icon=https://openvpn.net/favicon.ico"
RESPONSE=$(curl -s -w "\n%{http_code}" "$FINAL_URL")
# 打印调试信息
echo "请求 URL: $FINAL_URL"
echo "响应结果: $RESPONSE"
# 确保脚本返回 0,避免 OpenVPN 判定失败
exit 0
记得把执行权限加上:chmod +x /etc/openvpn/scripts/vpn-notify.sh
然后在 server.conf 中追加脚本位置等配置:
# 允许 OpenVPN 调用外部脚本
script-security 2
# 当客户端连接时执行
client-connect /etc/openvpn/scripts/vpn-notify.sh
# 当客户端断开时执行
client-disconnect /etc/openvpn/scripts/vpn-notify.sh
重启 openvpn 即可使用
正文完