阿里CDT vnstat 版的流量限制脚本修正版
以前用了这个从nodeseek上看到的脚本小改后来使用,结果今天不出意外的出了意外。跨月挂了。
分析了下代码,它的进出流量是取的 interface[0].traffic.total.tx和rx,这个是网卡累计总流量。在第一个月的时候是正确的,统计到的总流量就是当月流量嘛。但第二个月,就把前一个月的也包含进来了。
json里其实是应该取 interface[0].traffic.month[n].tx和rx,上面的下标n就是month里最大的那个,因为是按照时间升序排列的,下标最大的一个即为当前月。
修正后代码如下:
#!/bin/bash
# 设置网卡名称
INTERFACE="eth0"
# 设置流量限制(单位:GB)
LIMIT=195
# 获取当前月份的索引
MONTH_INDEX=$(vnstat -i $INTERFACE --json | jq '.interfaces[0].traffic.month | length - 1')
# 获取当月流量数据(单位:KB)
TX=$(vnstat -i $INTERFACE --json | jq --argjson idx "$MONTH_INDEX" '.interfaces[0].traffic.month[$idx].tx')
RX=$(vnstat -i $INTERFACE --json | jq --argjson idx "$MONTH_INDEX" '.interfaces[0].traffic.month[$idx].rx')
# 计算总流量(单位:GB)
GB1=$(echo "scale=2; $TX / 1024 / 1024 / 1024" | bc)
GB2=$(echo "scale=2; $RX / 1024 / 1024 / 1024" | bc)
GB1=$(printf "%.2f" $GB1)
GB2=$(printf "%.2f" $GB2)
echo "Total traffic out: $GB1 GB"
echo "Total traffic in: $GB2 GB"
# 比较并选择较大的流量值(共享带宽包)
if (( $(echo "$GB2 > $GB1" | bc -l) )); then
GB=$GB2
else
GB=$GB1
fi
echo "CBWP traffic: $GB GB"
# 检查是否超过流量限制
if (( $(echo "$GB >= $LIMIT" | bc -l) )); then
echo "Traffic limit exceeded. Disabling network interface."
ip link set $INTERFACE down
fi
科普下使用方式,时不时有朋友和我说我说得太简略了。。好吧,我假定0基础。
安装必要软件包 apt install bc jq vnstat
设置vnstat开机启动(奇大怪,正常apt install都会做这个,但vnstat似乎没有) systemctl enable vnstat
nano /usr/local/bin/checkcdt.sh 然后输入上面代码,然后 ctrl-x 存盘退出啦,有YES就YES,有默认值就默认值
chmod +x /usr/local/bin/checkcdt.sh
crontab -e 然后选择1,即 nano,如果第一次用的话。 然后在最后加上一行,
*/1 * * * * /usr/local/bin/checkcdt.sh
,然后ctrl-x退出。 搞定。
它会每分钟检查一次流量,如果到达了195G时就把网卡断了。不说复杂了,下个月的时候重启下机器就活过来了。