主题
以下基于debian12。 推荐宝塔或1Panel
的"计划任务",3秒检测1次(时间自行确定)。精确到5位数是为了与阿里云统计一致。 网卡eth0
要根据服务器实际网卡更改。 用之前确保安装jq
,bc
,vnstat
,即apt install jq&bc&vnstat
。
check_traffic.sh
shell
# 设置网卡名称
INTERFACE="eth0"
# 设置流量限制(单位:GB)
LIMIT=20
# 检查 vnstat 和 jq 是否已安装
if ! command -v vnstat &> /dev/null; then
echo "vnstat 未安装,请安装后重试。"
exit 1
fi
if ! command -v jq &> /dev/null; then
echo "jq 未安装,请安装后重试。"
exit 1
fi
# 检查 bc 是否已安装
if ! command -v bc &> /dev/null; then
echo "bc 未安装,请安装后重试。"
exit 1
fi
# 获取当前流量(单位:B)
VNSTAT_JSON=$(vnstat -i $INTERFACE --json)
echo "vnstat JSON 输出: $VNSTAT_JSON"
# 使用 jq 解析 JSON 数据获取接收和发送的流量(单位:B)
RX=$(echo $VNSTAT_JSON | jq -r '.interfaces[0].traffic.total.rx')
TX=$(echo $VNSTAT_JSON | jq -r '.interfaces[0].traffic.total.tx')
# 输出解析结果
echo "接收流量 (RX): $RX B"
echo "发送流量 (TX): $TX B"
# 检查 RX 和 TX 是否为有效的数字
if ! [[ $RX =~ ^[0-9]+$ ]] || ! [[ $TX =~ ^[0-9]+$ ]]; then
echo "RX 或 TX 不是有效的数字。"
exit 1
fi
# 计算总流量(单位:GB)
MAX=$(echo "if ($RX > $TX) $RX else $TX" | bc)
UPLOAD=$(echo "scale=5; $TX / 1024 / 1024 / 1024" | bc)
DOWNLOAD=$(echo "scale=5; $RX / 1024 / 1024 / 1024" | bc)
TOTAL=$(echo "scale=5; $MAX / 1024 / 1024 / 1024" | bc)
# 输出当前总流量
echo "当前流量:$TOTAL GB"
echo "当前上行:$UPLOAD GB"
echo "当前下行:$DOWNLOAD GB"
# 检查是否超过流量限制
if (( $(echo "$UPLOAD >= $LIMIT" | bc -l) )); then
echo "流量上行超出限制断网。"
sudo ip link set $INTERFACE down
else
echo "当前流量上行未超出限制。"
fi
reset_traffic.sh
推荐宝塔或者1Panel
的"计划任务",每月月初检测1次并重置。 网卡eth0
要根据服务器实际网卡更改。
shell
#设置网卡
INTERFACE="eth0"
# 停止vnStat服务
sudo systemctl stop vnstat # 如果使用systemd管理服务
# 删除vnStat数据库文件(根据需要修改网络接口名称)
sudo rm -f /var/lib/vnstat/* # 删除所有vnstat数据库文件
# 重新启动vnStat服务
sudo systemctl start vnstat # 如果使用systemd管理服务
sudo ip link set $INTERFACE up
echo "vnStat流量统计数据已重置。"