# This script is called on SSH login by /etc/profile.d/sshd_telegram.sh
# Modified from https://github.com/MyTheValentinus/ssh-login-alert-telegram
# Your USERID or Channel ID to display alert and key, we recommend you create new bot with @BotFather on Telegram
#你要修改的都在这里USERID,KEY,VPSNAME,PFTIME,LIMIT,LIMIT2
#========================================================
USERID=(1726762462)
KEY="填电报机器人key"
# 设置机器名字
VPSNAME="ali-hk1"
# 设置流量限制(单位:GB)
LIMIT=150
LIMIT2=160
# 设置间隔时间(单位:秒)
PFTIME=1800
#=========================================================
for i in "${USERID[@]}"
do
URL="https://api.telegram.org/bot${KEY}/sendMessage"
DATE="$(date "+%Y-%m-%d %H:%M:%S")"
# 设置网卡名称
INTERFACE="eth0"
SRV_HOSTNAME=$(hostname -f)
# 获取当前流量(单位:KB)====================================
VNSTAT_JSON=$(vnstat -i $INTERFACE --json)
# 使用 jq 解析 JSON 数据获取接收和发送的流量(单位:KB)
RX=$(echo $VNSTAT_JSON | jq -r '.interfaces[0].traffic.total.rx')
TX=$(echo $VNSTAT_JSON | jq -r '.interfaces[0].traffic.total.tx')
# 检查 RX 和 TX 是否为有效的数字
if ! [[ $RX =~ ^[0-9]+$ ]] || ! [[ $TX =~ ^[0-9]+$ ]]; then
exit 1
fi
# 计算总流量(单位:GB)
TOTAL=$(echo "scale=2; ($RX + $TX) / 1024 / 1024" | bc)
RX_GB=$(echo "scale=2; $RX / 1024 / 1024" | bc)
TX_GB=$(echo "scale=2; $TX / 1024 / 1024" | bc)
# 获取上次运行时间==========================================================
# 当前时间(秒)
current_time=$(date +%s)
# 默认上次执行时间为很久之前(这样首次运行时会执行else分支)
last_exec_time=0
# 时间戳文件路径
timestamp_file="/usr/unitls/else_exec_time.txt"
# 检查时间戳文件是否存在
if [ -f "$timestamp_file" ]; then
# 读取上次执行时间
last_exec_time=$(cat "$timestamp_file")
else
touch /usr/unitls/else_exec_time.txt
echo "else_exec_time.txt 文件已经创建." # 可选:输出提示信息
fi
# 计算时间差值
time_diff=$((current_time - last_exec_time))
#判断执行语句==============================================================
if (( $(echo "$RX_GB >= $LIMIT2" | bc -l) )) || (( $(echo "$TX_GB >= $LIMIT2" | bc -l) )); then
TEXT="${VPSNAME}(${SRV_HOSTNAME})当前流量使用情况:
入流量(接受流量): *${RX_GB}*
出流量(发送流量): *${TX_GB}*
时间: ${DATE}
其已超过160GB,已执行关机操作"
curl -s -d "chat_id=$i&text=${TEXT}&disable_web_page_preview=true&parse_mode=markdown" $URL > /dev/null
sudo shutdown -h now
elif (( $(echo "$RX_GB >= $LIMIT" | bc -l) )) || (( $(echo "$TX_GB >= $LIMIT" | bc -l) )); then
TEXT="${VPSNAME}(${SRV_HOSTNAME})当前流量使用情况:
入流量(接受流量): *${RX_GB}*
出流量(发送流量): *${TX_GB}*
时间: ${DATE}
其已超过150GB,超过160GB将执行关机操作"
curl -s -d "chat_id=$i&text=${TEXT}&disable_web_page_preview=true&parse_mode=markdown" $URL > /dev/null
else
if (( time_diff >= PFTIME )); then
# 记录操作时间
echo "$current_time" > "$timestamp_file"
TEXT="${VPSNAME}(${SRV_HOSTNAME})当前流量使用情况:
入流量(接受流量): *${RX_GB}*
出流量(发送流量): *${TX_GB}*
时间: ${DATE}
正常使用暂未超过150GB"
curl -s -d "chat_id=$i&text=${TEXT}&disable_web_page_preview=true&parse_mode=markdown" $URL > /dev/null
fi
fi
done
[/ol]复制代码
出入流量中的一个超过160就会关机并且给电报机器人发送通知。脚本每分钟执行一次。每次执行都会判定出入流量是否超标,没有超标的话,每30分钟向电报机器人发送截止当前时刻的出入流量。
前提是安装vnstat 和 jq 和bc。
vnstat修改了设置每分钟记录一次