<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://md5.pw/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Horrself</id>
	<title>md5.pw - 用户贡献 [zh]</title>
	<link rel="self" type="application/atom+xml" href="https://md5.pw/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Horrself"/>
	<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=Special:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/Horrself"/>
	<updated>2026-04-12T21:58:02Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://md5.pw/index.php?title=%E6%90%AC%E7%93%A6%E5%B7%A5_KiwiVM_%E9%9D%A2%E6%9D%BF_Audit_log%EF%BC%88%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97%EF%BC%89%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3&amp;diff=1358</id>
		<title>搬瓦工 KiwiVM 面板 Audit log（审计日志）功能详解</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E6%90%AC%E7%93%A6%E5%B7%A5_KiwiVM_%E9%9D%A2%E6%9D%BF_Audit_log%EF%BC%88%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97%EF%BC%89%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3&amp;diff=1358"/>
		<updated>2026-02-05T20:44:32Z</updated>

		<summary type="html">&lt;p&gt;Horrself：​修正&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;审计日志是 KiwiVM 面板提供的一项核心安全监控功能，它充当了服务器运维过程中的“记录仪”。通过该功能，管理员可以清晰的查看到所有通过管理面板下达的指令，这对于维护多用户环境下的账户安全以及追溯系统变更记录至关重要。&lt;br /&gt;
&lt;br /&gt;
== 一、 Audit log 功能定位与访问路径 ==&lt;br /&gt;
&lt;br /&gt;
在日常维护 VPS 时，了解谁在什么时候操作了服务器是基础安全要求。Audit log 功能被收纳在 KiwiVM 面板左侧菜单栏的 “Security &amp;amp; Records” 分类中。该功能属于系统底层日志，用户无需进行任何额外配置，系统会自动静默记录所有操作轨迹。&lt;br /&gt;
&lt;br /&gt;
[[File:Bwg-kiwivm-audit-log-entry.png|thumb|center|800px|alt=搬瓦工 KiwiVM 面板审计日志菜单位置|审计日志位于安全与记录分类下，是排查账户异常的首选工具]]&lt;br /&gt;
&lt;br /&gt;
== 二、 Audit log 界面参数与时区识别逻辑 ==&lt;br /&gt;
&lt;br /&gt;
Audit log 界面设计非常精简，旨在提供最高效的数据检索。页面顶部会显示系统自动识别的浏览器时区，这一机制确保了日志中的时间戳能够与管理员的本地操作时间完全对应，极大的方便了跨时区运维工作。&lt;br /&gt;
&lt;br /&gt;
[[File:Bwg-audit-log-timezone-info.png|thumb|center|800px|alt=搬瓦工审计日志时区自动识别显示|系统会自动识别当前环境时区（如 Asia/Shanghai），使日志时间更具参考价值]]&lt;br /&gt;
&lt;br /&gt;
在审计日志的表格中，每一行记录都包含以下三个核心要素，它们共同构成了完整的操作证据链：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 参数名称 !! 详细功能定义&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Time&#039;&#039;&#039; || 记录操作发生的精确时刻，精确到秒级，并包含时区偏差信息。&lt;br /&gt;
需要注意的是，对于拥有冬令时 &amp;amp; 夏令时的时区，会在相应时间进行切换，这可能导致时区上的理解误差。&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IP address&#039;&#039;&#039; || 发起操作请求的源 IP 地址。管理员可以通过此项判断是否存在非授权的异地登录。&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Action&#039;&#039;&#039; || 对该次操作的具体行为描述，是判定用户执行了何种指令的关键字段。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 三、 Audit log 常见审计记录行为词典 ==&lt;br /&gt;
&lt;br /&gt;
为了帮助管理员快速读懂全英文的操作记录，下表整理了审计日志中最高频出现的动作指令及其对应的中文含义。掌握这些术语有助于在查阅冗长日志时迅速定位关键事件。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 操作行为!! 中文功能说明&lt;br /&gt;
|-&lt;br /&gt;
| Control panel: successful login || 管理员已成功登录进入 KiwiVM 控制面板。&lt;br /&gt;
|-&lt;br /&gt;
| Billing platform requested a single-use login token || 从官网财务后台跳转进入时，系统自动生成的安全登录令牌。&lt;br /&gt;
|-&lt;br /&gt;
| Root password was reset || 执行了 Root 初始密码重置操作。&lt;br /&gt;
|-&lt;br /&gt;
| OS Reinstall || 执行了“重装系统”任务，日志通常会附带具体的系统版本。&lt;br /&gt;
|-&lt;br /&gt;
| VNC console started || 启动了 Web 端的 VNC 交互式控制台。&lt;br /&gt;
|-&lt;br /&gt;
| Migration from [机房A] to [机房B] || 记录了服务器在不同数据中心之间的“切换机房”轨迹。&lt;br /&gt;
|-&lt;br /&gt;
| Create / Delete / Export snapshot || 涉及到备份（快照）的创建、删除或导出为本地文件的操作。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 四、 审计日志（Audit log）安全实战：还原操作轨迹 ==&lt;br /&gt;
&lt;br /&gt;
审计日志不仅是历史记录的堆砌，更是账号安全防御的重要环。通过对 IP 地址和操作类型的交叉比对，管理员可以实现对 VPS 账户的深层次安全审计，还原出一台服务器从创建到运维的完整生命周期。&lt;br /&gt;
&lt;br /&gt;
[[File:Bwg-audit-log-sequence.png|thumb|center|800px|alt=搬瓦工审计日志历史轨迹还原演示|通过审计日志可以清晰复盘管理员的操作序列]]&lt;br /&gt;
&lt;br /&gt;
通过下表我们可以看到一个典型的安全审计案例，展示了如何利用日志发现系统变更：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 操作时间 (2025年) !! 发起 IP !! 操作行为说明&lt;br /&gt;
|-&lt;br /&gt;
| Dec 27, 21:11:45 || xxx.xx.xxx.xx || &#039;&#039;&#039;成功登录面板&#039;&#039;&#039;：管理员进入 KiwiVM 面板。&lt;br /&gt;
|-&lt;br /&gt;
| Dec 26, 22:04:45 || xxx.xx.xxx.xx || &#039;&#039;&#039;启动 VNC 终端&#039;&#039;&#039;：排查系统故障及查看日志记录。&lt;br /&gt;
|-&lt;br /&gt;
| Dec 24, 12:36:40 || xxx.xx.xxx.xx || &#039;&#039;&#039;重置 Root 密码&#039;&#039;&#039;：执行了系统最高权限变更记录。&lt;br /&gt;
|-&lt;br /&gt;
| Sep 24, 18:53:27 || xxx.xx.xxx.xx || &#039;&#039;&#039;机房迁移&#039;&#039;&#039;：执行了更换机房操作。&lt;br /&gt;
|-&lt;br /&gt;
| Sep 15, 19:24:52 || xxx.xx.xxx.xx || &#039;&#039;&#039;重装系统&#039;&#039;&#039;：成功部署了 Debian 13 环境。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 五、 127.0.0.1 内部记录解析 ==&lt;br /&gt;
&lt;br /&gt;
在查阅审计日志时，IP 地址 127.0.0.1 经常伴随“Billing platform requested a single-use login token”出现。这并非异常登录，而是搬瓦工官方系统的安全验证机制。当用户在官网后台管理界面点击进入 KiwiVM 时，系统会通过本地环回地址发起令牌请求，这代表该次访问是合法的官方跳转。&lt;br /&gt;
&lt;br /&gt;
[[File:Bwg-audit-log-internal-token.png|thumb|center|800px|alt=审计日志中 127.0.0.1 内部令牌记录解析|显示为 127.0.0.1 的记录属于官方系统握手，用户无需为此产生安全焦虑]]&lt;br /&gt;
&lt;br /&gt;
== 六、 运维建议与总结 ==&lt;br /&gt;
&lt;br /&gt;
综上所述，Audit log 是每一位搬瓦工用户都应掌握的工具。它将复杂的系统后台行为转化为清晰的时间轴，为用户提供了极高的数据透明度。&lt;br /&gt;
&lt;br /&gt;
建议管理员在进行重大运维操作（如修改密码、迁移数据中心）后，习惯性的进入审计日志页面进行核对。这不仅能确认操作是否已成功生效，还能在向技术支持寻求帮助时，提供精准的操作时间戳作为证据。养成定期审计日志的习惯，是保障服务器长期稳定运行的关键环节。&lt;br /&gt;
&lt;br /&gt;
[[Category:200 KiwiVM 简介 — KiwiVM Introduction]]&lt;/div&gt;</summary>
		<author><name>Horrself</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8%E6%90%AC%E7%93%A6%E5%B7%A5api%E7%9B%91%E6%8E%A7%E7%BD%91%E7%BB%9C%E6%B5%81%E9%87%8F%E7%9A%84%E4%BD%BF%E7%94%A8%E5%B9%B6telegrambot%E9%80%9A%E7%9F%A5&amp;diff=1357</id>
		<title>使用搬瓦工api监控网络流量的使用并telegrambot通知</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8%E6%90%AC%E7%93%A6%E5%B7%A5api%E7%9B%91%E6%8E%A7%E7%BD%91%E7%BB%9C%E6%B5%81%E9%87%8F%E7%9A%84%E4%BD%BF%E7%94%A8%E5%B9%B6telegrambot%E9%80%9A%E7%9F%A5&amp;diff=1357"/>
		<updated>2026-02-05T20:43:56Z</updated>

		<summary type="html">&lt;p&gt;Horrself：​修正&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 使用前 ==&lt;br /&gt;
&lt;br /&gt;
=== 获取veid和apikey ===&lt;br /&gt;
请参考 [[搬瓦工api使用]]&lt;br /&gt;
&lt;br /&gt;
=== 获取telegramBOT和bot token和chat_id ===&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;同样需要保存好bot token和chat_id&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;同样需要保存好bot token和chat_id&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;同样需要保存好bot token和chat_id&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== bot token ====&lt;br /&gt;
&lt;br /&gt;
在telegram搜索框搜索 botfather 找到如图的这位&lt;br /&gt;
&lt;br /&gt;
[[File:Botfather.png|border]]&lt;br /&gt;
&lt;br /&gt;
点击打开 如果你没有任何机器人的话 点击&amp;lt;code&amp;gt;create a new bot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Createtelegrambot.png|border]]&lt;br /&gt;
&lt;br /&gt;
[[File:Createtelegrambot1.png|border]]&lt;br /&gt;
&lt;br /&gt;
在这两个地方 输入 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Bot Name&amp;lt;/code&amp;gt;  bot的名字用于显示&lt;br /&gt;
&lt;br /&gt;
和&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;username_bot&amp;lt;/code&amp;gt; 搜索bot时用的&lt;br /&gt;
&lt;br /&gt;
其中&amp;lt;code&amp;gt;username_bot&amp;lt;/code&amp;gt; 必须是bot结尾 比如 abot或者a_bot&lt;br /&gt;
&lt;br /&gt;
输入后 显示是绿色的文本提示(你的username_bot名字 is available)就可以按&amp;lt;code&amp;gt;create bot&amp;lt;/code&amp;gt;了&lt;br /&gt;
&lt;br /&gt;
[[File:Createtelegrambot2.png|border]]&lt;br /&gt;
&lt;br /&gt;
[[File:Createtelegrambot3.png|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
创建好后按copy 就复制bot token了 &lt;br /&gt;
&lt;br /&gt;
马赛克区域(绿色框)可以点一下 就可以显示bot token (不要给别人看...)&lt;br /&gt;
&lt;br /&gt;
如果你有bot 选择一个你要推送消息的bot 就会跳到上面这个页面 直接点copy就可以复制bot token了&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;chat_id&#039;&#039;&#039; ====&lt;br /&gt;
需要先获取bot token&lt;br /&gt;
&lt;br /&gt;
[[File:Createtelegrambot3.png|border]]&lt;br /&gt;
&lt;br /&gt;
点击bot的username_bot名字的位置 就是黄色框框&lt;br /&gt;
&lt;br /&gt;
[[File:Botinfo.png|border]]&lt;br /&gt;
&lt;br /&gt;
弹出界面 选 蓝色框框的图标&lt;br /&gt;
&lt;br /&gt;
[[File:Telegramstart.png|border]]&lt;br /&gt;
&lt;br /&gt;
打开这个页面 选择 &#039;&#039;&#039;开始&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
然后用浏览器打开&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://api.telegram.org/bot替换成你复制的bottoken/getUpdates&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 &#039;&#039;&#039;替换成你复制的bottoken&#039;&#039;&#039; 这几个字删掉 然后粘贴copy的token 就可以了&lt;br /&gt;
&lt;br /&gt;
[[File:Webgettelegramchatid.png|border]]&lt;br /&gt;
&lt;br /&gt;
在chat后面跟着的这个id就是你的chat_id了&lt;br /&gt;
&lt;br /&gt;
== 配置检测脚本 ==&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;切换到root账户&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
* 输入命令：&amp;lt;code&amp;gt;su -&amp;lt;/code&amp;gt;&#039;&#039;(注意：su 后面有个空格和减号，这很重要，代表同时切换环境变量)&#039;&#039;&lt;br /&gt;
* 输入 Root 密码（输入时看不见）。&lt;br /&gt;
* 此时你的提示符会变成 &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;，代表你又是 Root 了。&lt;br /&gt;
&lt;br /&gt;
[[File:Su-.png|border]]&lt;br /&gt;
&lt;br /&gt;
=== 服务器脚本 ===&lt;br /&gt;
&#039;&#039;&#039;veid和api_key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
VEID=&amp;quot;你的veid&amp;quot;&lt;br /&gt;
&lt;br /&gt;
API_KEY=&amp;quot;你的api_key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;通知telegram的阈值数组 (百分比)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
NOTIFY_THRESHOLDS=(50 80 90 95)&lt;br /&gt;
&lt;br /&gt;
默认在50 80 90 95的时候通知&lt;br /&gt;
&lt;br /&gt;
每一个数代表一个超过就通知的百分比你可以添加(30 50 80 90 95)&lt;br /&gt;
&lt;br /&gt;
每个中间要有空格&lt;br /&gt;
&lt;br /&gt;
也可以减少 比如(50  95)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Telegram 配置&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
TG_BOT_TOKEN=&amp;quot;你的机器人token&amp;quot; &lt;br /&gt;
&lt;br /&gt;
TG_CHAT_ID=&amp;quot;你的telegram ID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
设定telegram静音推送的开始时间和结束时间&lt;br /&gt;
&lt;br /&gt;
(使用 UTC 小时 0-23) 北京时间 19:00 - 08:00 对应 UTC 11:00 - 00:00&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;静音开始时间&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SILENT_UTC_START=11&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;静音结束时间&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SILENT_UTC_END=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;如果你明白以下内容也可以修改&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;存储目录&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
STORAGE_DIR=&amp;quot;$HOME/.cache/bwg_monitor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;缓存数据存放的文件&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
DATA_FILE=&amp;quot;$STORAGE_DIR/usage_data.json&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;日志存放文件&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
LOG_FILE=&amp;quot;$STORAGE_DIR/monitor.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;日志超过多少就删除&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
LOG_MAX_LINES=500&lt;br /&gt;
&lt;br /&gt;
==== 检查文件是否存在 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
输入 &amp;lt;code&amp;gt;ls /root/bwg_monitor.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Checkfile1.png|border]]&lt;br /&gt;
&lt;br /&gt;
如果是红色框框 就是&#039;&#039;&#039;文件已经存在&#039;&#039;&#039;你就换个名字比如 /root/bwg_monitor1.sh 如果改了文件名 下面的这个就都要改成 /root/bwg_monitor1.sh&lt;br /&gt;
&lt;br /&gt;
如果是蓝色框框 就是&#039;&#039;&#039;文件不存在&#039;&#039;&#039; 就不用改&lt;br /&gt;
&lt;br /&gt;
修改后&lt;br /&gt;
&lt;br /&gt;
复制代码块的所有内容 粘贴到ssh里面 按回车就行了&lt;br /&gt;
&lt;br /&gt;
脚本代码块:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; &#039;EOF&#039; &amp;gt; /root/bwg_monitor.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# ================= 配置区 =================&lt;br /&gt;
VEID=&amp;quot;你的veid&amp;quot;&lt;br /&gt;
API_KEY=&amp;quot;你的api_key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 预警阈值数组 (百分比)&lt;br /&gt;
NOTIFY_THRESHOLDS=(50 80 90 95)&lt;br /&gt;
&lt;br /&gt;
# Telegram 配置&lt;br /&gt;
TG_BOT_TOKEN=&amp;quot;你的机器人token&amp;quot;&lt;br /&gt;
TG_CHAT_ID=&amp;quot;你的telegram ID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# (使用 UTC 小时 0-23) 北京时间 19:00 - 08:00 对应 UTC 11:00 - 00:00&lt;br /&gt;
SILENT_UTC_START=11&lt;br /&gt;
SILENT_UTC_END=0&lt;br /&gt;
&lt;br /&gt;
STORAGE_DIR=&amp;quot;$HOME/.cache/bwg_monitor&amp;quot;&lt;br /&gt;
DATA_FILE=&amp;quot;$STORAGE_DIR/usage_data.json&amp;quot;&lt;br /&gt;
LOG_FILE=&amp;quot;$STORAGE_DIR/monitor.log&amp;quot;&lt;br /&gt;
LOG_MAX_LINES=500&lt;br /&gt;
# ==========================================&lt;br /&gt;
&lt;br /&gt;
mkdir -p &amp;quot;$STORAGE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 增强型 JSON 提取函数 (无需 jq, 适配各种空格格式)&lt;br /&gt;
get_json_num() {&lt;br /&gt;
    echo &amp;quot;$1&amp;quot; | grep -o &amp;quot;\&amp;quot;$2\&amp;quot;:[^,}]*&amp;quot; | sed &#039;s/.*://;s/[ &amp;quot;]*//g&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
log_message() {&lt;br /&gt;
    local msg=&amp;quot;$1&amp;quot;&lt;br /&gt;
    local timestamp=$(date &#039;+%Y-%m-%d %H:%M:%S&#039;)&lt;br /&gt;
    echo &amp;quot;$timestamp $msg&amp;quot; &amp;gt;&amp;gt; &amp;quot;$LOG_FILE&amp;quot;&lt;br /&gt;
    # 自动清理旧日志&lt;br /&gt;
    if [ $(wc -l &amp;lt; &amp;quot;$LOG_FILE&amp;quot;) -gt &amp;quot;$LOG_MAX_LINES&amp;quot; ]; then&lt;br /&gt;
        sed -i &amp;quot;1,$((LOG_MAX_LINES/2))d&amp;quot; &amp;quot;$LOG_FILE&amp;quot;&lt;br /&gt;
        echo &amp;quot;$(date &#039;+%Y-%m-%d %H:%M:%S&#039;) [INFO] 日志已自动减半清理。&amp;quot; &amp;gt;&amp;gt; &amp;quot;$LOG_FILE&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
send_tg_msg() {&lt;br /&gt;
    local message=&amp;quot;$1&amp;quot;&lt;br /&gt;
    local is_test_mode=&amp;quot;$2&amp;quot;&lt;br /&gt;
    local silent_param=&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # 获取当前 UTC 小时&lt;br /&gt;
    local current_utc_hour=$(date -u +%H)&lt;br /&gt;
    current_utc_hour=$((10#$current_utc_hour))&lt;br /&gt;
&lt;br /&gt;
    # --- 跨午夜逻辑判断 ---&lt;br /&gt;
    local is_silent=false&lt;br /&gt;
    if [ &amp;quot;$SILENT_UTC_START&amp;quot; -lt &amp;quot;$SILENT_UTC_END&amp;quot; ]; then&lt;br /&gt;
        # 情况 A: 时间段不跨越午夜 (如 10:00-18:00)&lt;br /&gt;
        if [ &amp;quot;$current_utc_hour&amp;quot; -ge &amp;quot;$SILENT_UTC_START&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$current_utc_hour&amp;quot; -lt &amp;quot;$SILENT_UTC_END&amp;quot; ]; then&lt;br /&gt;
            is_silent=true&lt;br /&gt;
        fi&lt;br /&gt;
    else&lt;br /&gt;
        # 情况 B: 时间段跨越午夜 (如 11:00-00:00)&lt;br /&gt;
        if [ &amp;quot;$current_utc_hour&amp;quot; -ge &amp;quot;$SILENT_UTC_START&amp;quot; ] || [ &amp;quot;$current_utc_hour&amp;quot; -lt &amp;quot;$SILENT_UTC_END&amp;quot; ]; then&lt;br /&gt;
            is_silent=true&lt;br /&gt;
        fi&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    [ &amp;quot;$is_silent&amp;quot; = true ] &amp;amp;&amp;amp; silent_param=&amp;quot;-d disable_notification=true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # 执行发送&lt;br /&gt;
    local res=$(curl -s -X POST &amp;quot;https://api.telegram.org/bot$TG_BOT_TOKEN/sendMessage&amp;quot; \&lt;br /&gt;
        -d &amp;quot;chat_id=$TG_CHAT_ID&amp;quot; \&lt;br /&gt;
        $silent_param \&lt;br /&gt;
        -d &amp;quot;text=$message&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if [[ &amp;quot;$res&amp;quot; == *&amp;quot;\&amp;quot;ok\&amp;quot;:true&amp;quot;* ]]; then&lt;br /&gt;
        if [[ &amp;quot;$is_test_mode&amp;quot; == &amp;quot;-t&amp;quot; ]]; then&lt;br /&gt;
            echo &amp;quot;✅ Telegram 发送成功！ (静音模式: $is_silent)&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            log_message &amp;quot;[SUCCESS] Telegram 预警已送达 (静音: $is_silent)。&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        return 0&lt;br /&gt;
    else&lt;br /&gt;
        if [[ &amp;quot;$is_test_mode&amp;quot; == &amp;quot;-t&amp;quot; ]]; then&lt;br /&gt;
            echo &amp;quot;❌ Telegram 错误: $res&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            log_message &amp;quot;[ERROR] Telegram 失败: $res&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        return 1&lt;br /&gt;
    fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# --- 处理测试参数 -t ---&lt;br /&gt;
if [[ &amp;quot;$1&amp;quot; == &amp;quot;-t&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;--- 正在进入模拟测试模式 ---&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # 模拟输入值&lt;br /&gt;
    MOCK_PLAN=2147483648000&lt;br /&gt;
    MOCK_USED=77207619653&lt;br /&gt;
    MOCK_MULT=1&lt;br /&gt;
    # 模拟重置时间：当前时间 + 1天 (86400秒)&lt;br /&gt;
    MOCK_NEXT_RESET=$(($(date +%s) + 86400))&lt;br /&gt;
    &lt;br /&gt;
    # 计算逻辑&lt;br /&gt;
    M_PLAN_KB=$(( MOCK_PLAN * MOCK_MULT / 1024 ))&lt;br /&gt;
    M_USED_KB=$(( MOCK_USED * MOCK_MULT / 1024 ))&lt;br /&gt;
    M_USAGE_PERCENT=$(( M_USED_KB * 100 / M_PLAN_KB ))&lt;br /&gt;
    &lt;br /&gt;
    M_USED_GB=$(( M_USED_KB / 1024 / 1024 ))&lt;br /&gt;
    M_TOTAL_GB=$(( M_PLAN_KB / 1024 / 1024 ))&lt;br /&gt;
    M_RESET_DATE=$(date -d @&amp;quot;$MOCK_NEXT_RESET&amp;quot; &#039;+%Y-%m-%d %H:%M&#039;)&lt;br /&gt;
&lt;br /&gt;
    TEST_MSG=&amp;quot;🔔 搬瓦工监控模拟测试&lt;br /&gt;
当前进度: $M_USAGE_PERCENT%&lt;br /&gt;
已用流量: ${M_USED_GB} GB&lt;br /&gt;
总量配额: ${M_TOTAL_GB} GB&lt;br /&gt;
下次重置: $M_RESET_DATE&lt;br /&gt;
------------------&lt;br /&gt;
如果收到此消息，说明 Bot 配置与计算逻辑正常。&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;计算结果: 已用 $M_USAGE_PERCENT% ($M_USED_GB/$M_TOTAL_GB GB)&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    if send_tg_msg &amp;quot;$TEST_MSG&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;✅ 测试成功！请检查 Telegram。&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;❌ 测试失败！请检查 Token/ID 或网络连接。&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;--- 测试结束 (数据未保存) ---&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# --- 正式运行逻辑 ---&lt;br /&gt;
RESPONSE=$(curl -s -X POST &amp;quot;https://api.64clouds.com/v1/getServiceInfo&amp;quot; -d &amp;quot;veid=$VEID&amp;quot; -d &amp;quot;api_key=$API_KEY&amp;quot;)&lt;br /&gt;
ERROR_CODE=$(get_json_num &amp;quot;$RESPONSE&amp;quot; &amp;quot;error&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if [[ &amp;quot;$ERROR_CODE&amp;quot; != &amp;quot;0&amp;quot; ]]; then&lt;br /&gt;
    log_message &amp;quot;[ERROR] API 请求失败: $RESPONSE&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# 提取关键数据&lt;br /&gt;
PLAN=$(get_json_num &amp;quot;$RESPONSE&amp;quot; &amp;quot;plan_monthly_data&amp;quot;)&lt;br /&gt;
USED=$(get_json_num &amp;quot;$RESPONSE&amp;quot; &amp;quot;data_counter&amp;quot;)&lt;br /&gt;
MULT=$(get_json_num &amp;quot;$RESPONSE&amp;quot; &amp;quot;monthly_data_multiplier&amp;quot;)&lt;br /&gt;
NEXT_RESET=$(get_json_num &amp;quot;$RESPONSE&amp;quot; &amp;quot;data_next_reset&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 转换 KB 预防 32 位溢出&lt;br /&gt;
PLAN_KB=$(( PLAN * MULT / 1024 ))&lt;br /&gt;
USED_KB=$(( USED * MULT / 1024 ))&lt;br /&gt;
USAGE_PERCENT=$(( USED_KB * 100 / PLAN_KB ))&lt;br /&gt;
&lt;br /&gt;
# 读取历史数据&lt;br /&gt;
HIST_NOTIFIED=$(get_json_num &amp;quot;$(cat &amp;quot;$DATA_FILE&amp;quot; 2&amp;gt;/dev/null || echo &#039;{&amp;quot;notified_level&amp;quot;:-1}&#039;)&amp;quot; &amp;quot;notified_level&amp;quot;)&lt;br /&gt;
HIST_RESET_TS=$(get_json_num &amp;quot;$(cat &amp;quot;$DATA_FILE&amp;quot; 2&amp;gt;/dev/null || echo &#039;{&amp;quot;last_check_ts&amp;quot;:0}&#039;)&amp;quot; &amp;quot;last_check_ts&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 跨周期重置&lt;br /&gt;
if [[ &amp;quot;$NEXT_RESET&amp;quot; != &amp;quot;$HIST_RESET_TS&amp;quot; ]]; then&lt;br /&gt;
    HIST_NOTIFIED=-1&lt;br /&gt;
    log_message &amp;quot;[INFO] 进入新计费周期。&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
FINAL_NOTIFY_LEVEL=$HIST_NOTIFIED&lt;br /&gt;
for level in &amp;quot;${NOTIFY_THRESHOLDS[@]}&amp;quot;; do&lt;br /&gt;
    if [ &amp;quot;$USAGE_PERCENT&amp;quot; -ge &amp;quot;$level&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$level&amp;quot; -gt &amp;quot;$HIST_NOTIFIED&amp;quot; ]; then&lt;br /&gt;
        USED_GB=$(( USED_KB / 1024 / 1024 ))&lt;br /&gt;
        TOTAL_GB=$(( PLAN_KB / 1024 / 1024 ))&lt;br /&gt;
        RESET_DATE=$(date -d @&amp;quot;$NEXT_RESET&amp;quot; &#039;+%Y-%m-%d %H:%M&#039;)&lt;br /&gt;
        &lt;br /&gt;
        MSG=&amp;quot;🚨 搬瓦工流量预警&lt;br /&gt;
进度: $USAGE_PERCENT%&lt;br /&gt;
已用: ${USED_GB} GB&lt;br /&gt;
总量: ${TOTAL_GB} GB&lt;br /&gt;
重置日期: $RESET_DATE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        if send_tg_msg &amp;quot;$MSG&amp;quot;; then&lt;br /&gt;
            FINAL_NOTIFY_LEVEL=$level&lt;br /&gt;
            log_message &amp;quot;[SUCCESS] 发送 $level% 通知。&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# 保存状态&lt;br /&gt;
echo &amp;quot;{\&amp;quot;total_usage_kb\&amp;quot;:$USED_KB,\&amp;quot;last_check_ts\&amp;quot;:$NEXT_RESET,\&amp;quot;notified_level\&amp;quot;:$FINAL_NOTIFY_LEVEL}&amp;quot; &amp;gt; &amp;quot;$DATA_FILE&amp;quot;&lt;br /&gt;
log_message &amp;quot;[INFO] 检查完毕: $USAGE_PERCENT%&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 授予执行权限 ====&lt;br /&gt;
输入 &amp;lt;code&amp;gt;chmod +x /root/bwg_monitor.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后输入 &amp;lt;code&amp;gt;ls -l /root/bwg_monitor.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果像蓝色框框 有x就说明有执行权限了 如果是红色的-就说明还没执行的权限[[File:Chmod1.png|border]]&lt;br /&gt;
&lt;br /&gt;
==== 测试telegram推送 ====&lt;br /&gt;
输入 &amp;lt;code&amp;gt;/root/bwg_monitor.sh -t&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Telegramsend.png|border]]&lt;br /&gt;
&lt;br /&gt;
[[File:Telegramtest.png|border]]&lt;br /&gt;
&lt;br /&gt;
如下是失败了 你的bot token或 chat_id 不正确&lt;br /&gt;
&lt;br /&gt;
[[File:Telegramsenderror.png|border]]&lt;br /&gt;
&lt;br /&gt;
正常就可以配置开机自动启动了&lt;br /&gt;
&lt;br /&gt;
=== 配置开机自动启动 ===&lt;br /&gt;
&lt;br /&gt;
=== 第一步：创建 Service 文件 ===&lt;br /&gt;
这个文件告诉系统“要运行什么”。&lt;br /&gt;
&lt;br /&gt;
这里你也可以去 &amp;lt;code&amp;gt;ls /etc/systemd/system/bwg-monitor.service&amp;lt;/code&amp;gt;  检查一下这个文件是否存在防止被覆盖... 但一般不会有吧.... 如果存在就 把 &amp;lt;code&amp;gt;/etc/systemd/system/bwg-monitor.service&amp;lt;/code&amp;gt;改成&amp;lt;code&amp;gt;/etc/systemd/system/bwg-monitor1.service&amp;lt;/code&amp;gt;之类的 只改最后一个/ 后面 和 . 之前的 就是 /etc/systemd/system/这里可以修改.service&lt;br /&gt;
&lt;br /&gt;
如果你修改了 下面的也要改 并且要一样才行&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
替换你的实际文件名和路径 &lt;br /&gt;
&lt;br /&gt;
ExecStart=/bin/bash /root/bwg_monitor.sh 如果你上面没改 那就这样就行&lt;br /&gt;
&lt;br /&gt;
bwg_monitor.sh 是你的文件名&lt;br /&gt;
&lt;br /&gt;
/root/ 代表是 / 目录下的 root 目录 下的 bwg_monitor.sh 文件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; &#039;EOF&#039; &amp;gt; /etc/systemd/system/bwg-monitor.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=BandwagonHost Traffic Monitor Service&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
# 替换为你的实际文件名&lt;br /&gt;
ExecStart=/bin/bash /root/bwg_monitor.sh&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 第二步：创建 Timer 文件 ===&lt;br /&gt;
这个文件告诉系统“什么时候运行”。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/systemd/system/bwg-monitor.timer&amp;lt;/code&amp;gt;同上你可以检查一下&lt;br /&gt;
&lt;br /&gt;
如果你修改了文件名 需要注意的是 两个文件名的名字需要一致 &amp;lt;code&amp;gt;bwg-a.timer&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;bwg-a.service&amp;lt;/code&amp;gt;  .timer和.service 之前的那个文件名&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有几个可以修改的地方&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; 开机后 2 分钟开始第一次执行 &lt;br /&gt;
&lt;br /&gt;
OnBootSec=2min &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; 之后每隔 1 小时执行一次 &lt;br /&gt;
&lt;br /&gt;
OnUnitActiveSec=1h &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; 如果关机错过了时间，开机后立刻补跑 &lt;br /&gt;
&lt;br /&gt;
Persistent=true&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; &#039;EOF&#039; &amp;gt; /etc/systemd/system/bwg-monitor.timer&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run BandwagonHost Traffic Monitor every hour&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
# 开机后 2 分钟开始第一次执行&lt;br /&gt;
OnBootSec=2min&lt;br /&gt;
# 之后每隔 1 小时执行一次&lt;br /&gt;
OnUnitActiveSec=1h&lt;br /&gt;
# 如果关机错过了时间，开机后立刻补跑&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 第三步：启动并激活 ===&lt;br /&gt;
在终端执行以下命令：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 重新加载配置&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
# 启动定时器并设置为开机自启&lt;br /&gt;
systemctl enable --now bwg-monitor.timer&lt;br /&gt;
&lt;br /&gt;
# 查看定时器状态&lt;br /&gt;
systemctl status bwg-monitor.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[File:Systemctlstatusbwg.png|border]]&lt;br /&gt;
&lt;br /&gt;
蓝色框框说明是定时器已经正常运行&lt;br /&gt;
&lt;br /&gt;
红色框框是已经开启了 自动开机启动&lt;br /&gt;
&lt;br /&gt;
绿色的框框代表service正在等待 只要不是红色的就行了&lt;br /&gt;
&lt;br /&gt;
=== 缓存和日志的存储位置 ===&lt;br /&gt;
在 默认位置在 &#039;&#039;&#039;$HOME/.cache/bwg_monitor/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
如果你是按照本文来的那$HOME就是/root 完整路径就是 &#039;&#039;&#039;/root/.cache/bwg_monitor/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Store.png|border]]&lt;br /&gt;
&lt;br /&gt;
monitor.log是执行过程记录的日志&lt;br /&gt;
&lt;br /&gt;
usage_data.json是缓存信息&lt;br /&gt;
&lt;br /&gt;
如果需要重复测试的话 需要删除usage_data.json缓存信息 &lt;br /&gt;
&lt;br /&gt;
如果你按照本文的来的话切换了root账户&lt;br /&gt;
&lt;br /&gt;
就输入 &amp;lt;code&amp;gt;rm /root/.cache/bwg_monitor/usage_data.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不是root账户的话  就用这个 &amp;lt;code&amp;gt;rm $HOME/.cache/bwg_monitor/usage_data.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果出现错误和非预期情况请检查 &amp;lt;code&amp;gt;cat $HOME/.cache/bwg_monitor/monitor.log&amp;lt;/code&amp;gt;的信息&lt;br /&gt;
&lt;br /&gt;
注：流量重置时间是根据实例的精确创建时间计算得来的，如在 8日 01:02:03 +0800创建实例，则理论上会在下一个月的同一时间重置流量。但由于官方使用的时区是太平洋时间，流量重置时间会在冬令时和夏令时切换后有一小时的偏移。&lt;br /&gt;
[[Category:500 常见应用指南 — Application Guides]]&lt;/div&gt;</summary>
		<author><name>Horrself</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8%E6%90%AC%E7%93%A6%E5%B7%A5api%E7%9B%91%E6%8E%A7%E7%BD%91%E7%BB%9C%E6%B5%81%E9%87%8F%E7%9A%84%E4%BD%BF%E7%94%A8%E5%B9%B6telegrambot%E9%80%9A%E7%9F%A5&amp;diff=1356</id>
		<title>使用搬瓦工api监控网络流量的使用并telegrambot通知</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E4%BD%BF%E7%94%A8%E6%90%AC%E7%93%A6%E5%B7%A5api%E7%9B%91%E6%8E%A7%E7%BD%91%E7%BB%9C%E6%B5%81%E9%87%8F%E7%9A%84%E4%BD%BF%E7%94%A8%E5%B9%B6telegrambot%E9%80%9A%E7%9F%A5&amp;diff=1356"/>
		<updated>2026-02-05T20:41:56Z</updated>

		<summary type="html">&lt;p&gt;Horrself：​添加关于流量重置时间的备注&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== 使用前 ==&lt;br /&gt;
&lt;br /&gt;
=== 获取veid和apikey ===&lt;br /&gt;
请参考 [[搬瓦工api使用]]&lt;br /&gt;
&lt;br /&gt;
=== 获取telegramBOT和bot token和chat_id ===&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;同样需要保存好bot token和chat_id&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;同样需要保存好bot token和chat_id&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;big&amp;gt;同样需要保存好bot token和chat_id&amp;lt;/big&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== bot token ====&lt;br /&gt;
&lt;br /&gt;
在telegram搜索框搜索 botfather 找到如图的这位&lt;br /&gt;
&lt;br /&gt;
[[File:Botfather.png|border]]&lt;br /&gt;
&lt;br /&gt;
点击打开 如果你没有任何机器人的话 点击&amp;lt;code&amp;gt;create a new bot&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Createtelegrambot.png|border]]&lt;br /&gt;
&lt;br /&gt;
[[File:Createtelegrambot1.png|border]]&lt;br /&gt;
&lt;br /&gt;
在这两个地方 输入 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Bot Name&amp;lt;/code&amp;gt;  bot的名字用于显示&lt;br /&gt;
&lt;br /&gt;
和&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;username_bot&amp;lt;/code&amp;gt; 搜索bot时用的&lt;br /&gt;
&lt;br /&gt;
其中&amp;lt;code&amp;gt;username_bot&amp;lt;/code&amp;gt; 必须是bot结尾 比如 abot或者a_bot&lt;br /&gt;
&lt;br /&gt;
输入后 显示是绿色的文本提示(你的username_bot名字 is available)就可以按&amp;lt;code&amp;gt;create bot&amp;lt;/code&amp;gt;了&lt;br /&gt;
&lt;br /&gt;
[[File:Createtelegrambot2.png|border]]&lt;br /&gt;
&lt;br /&gt;
[[File:Createtelegrambot3.png|border]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
创建好后按copy 就复制bot token了 &lt;br /&gt;
&lt;br /&gt;
马赛克区域(绿色框)可以点一下 就可以显示bot token (不要给别人看...)&lt;br /&gt;
&lt;br /&gt;
如果你有bot 选择一个你要推送消息的bot 就会跳到上面这个页面 直接点copy就可以复制bot token了&lt;br /&gt;
&lt;br /&gt;
==== &#039;&#039;&#039;chat_id&#039;&#039;&#039; ====&lt;br /&gt;
需要先获取bot token&lt;br /&gt;
&lt;br /&gt;
[[File:Createtelegrambot3.png|border]]&lt;br /&gt;
&lt;br /&gt;
点击bot的username_bot名字的位置 就是黄色框框&lt;br /&gt;
&lt;br /&gt;
[[File:Botinfo.png|border]]&lt;br /&gt;
&lt;br /&gt;
弹出界面 选 蓝色框框的图标&lt;br /&gt;
&lt;br /&gt;
[[File:Telegramstart.png|border]]&lt;br /&gt;
&lt;br /&gt;
打开这个页面 选择 &#039;&#039;&#039;开始&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
然后用浏览器打开&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;https://api.telegram.org/bot替换成你复制的bottoken/getUpdates&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
把 &#039;&#039;&#039;替换成你复制的bottoken&#039;&#039;&#039; 这几个字删掉 然后粘贴copy的token 就可以了&lt;br /&gt;
&lt;br /&gt;
[[File:Webgettelegramchatid.png|border]]&lt;br /&gt;
&lt;br /&gt;
在chat后面跟着的这个id就是你的chat_id了&lt;br /&gt;
&lt;br /&gt;
== 配置检测脚本 ==&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;切换到root账户&#039;&#039;&#039; ===&lt;br /&gt;
&lt;br /&gt;
* 输入命令：&amp;lt;code&amp;gt;su -&amp;lt;/code&amp;gt;&#039;&#039;(注意：su 后面有个空格和减号，这很重要，代表同时切换环境变量)&#039;&#039;&lt;br /&gt;
* 输入 Root 密码（输入时看不见）。&lt;br /&gt;
* 此时你的提示符会变成 &amp;lt;code&amp;gt;#&amp;lt;/code&amp;gt;，代表你又是 Root 了。&lt;br /&gt;
&lt;br /&gt;
[[File:Su-.png|border]]&lt;br /&gt;
&lt;br /&gt;
=== 服务器脚本 ===&lt;br /&gt;
&#039;&#039;&#039;veid和api_key&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
VEID=&amp;quot;你的veid&amp;quot;&lt;br /&gt;
&lt;br /&gt;
API_KEY=&amp;quot;你的api_key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;通知telegram的阈值数组 (百分比)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
NOTIFY_THRESHOLDS=(50 80 90 95)&lt;br /&gt;
&lt;br /&gt;
默认在50 80 90 95的时候通知&lt;br /&gt;
&lt;br /&gt;
每一个数代表一个超过就通知的百分比你可以添加(30 50 80 90 95)&lt;br /&gt;
&lt;br /&gt;
每个中间要有空格&lt;br /&gt;
&lt;br /&gt;
也可以减少 比如(50  95)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Telegram 配置&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
TG_BOT_TOKEN=&amp;quot;你的机器人token&amp;quot; &lt;br /&gt;
&lt;br /&gt;
TG_CHAT_ID=&amp;quot;你的telegram ID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
设定telegram静音推送的开始时间和结束时间&lt;br /&gt;
&lt;br /&gt;
(使用 UTC 小时 0-23) 北京时间 19:00 - 08:00 对应 UTC 11:00 - 00:00&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;静音开始时间&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SILENT_UTC_START=11&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;静音结束时间&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
SILENT_UTC_END=0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;如果你明白以下内容也可以修改&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;存储目录&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
STORAGE_DIR=&amp;quot;$HOME/.cache/bwg_monitor&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;缓存数据存放的文件&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
DATA_FILE=&amp;quot;$STORAGE_DIR/usage_data.json&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;日志存放文件&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
LOG_FILE=&amp;quot;$STORAGE_DIR/monitor.log&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;日志超过多少就删除&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
LOG_MAX_LINES=500&lt;br /&gt;
&lt;br /&gt;
==== 检查文件是否存在 ====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
输入 &amp;lt;code&amp;gt;ls /root/bwg_monitor.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Checkfile1.png|border]]&lt;br /&gt;
&lt;br /&gt;
如果是红色框框 就是&#039;&#039;&#039;文件已经存在&#039;&#039;&#039;你就换个名字比如 /root/bwg_monitor1.sh 如果改了文件名 下面的这个就都要改成 /root/bwg_monitor1.sh&lt;br /&gt;
&lt;br /&gt;
如果是蓝色框框 就是&#039;&#039;&#039;文件不存在&#039;&#039;&#039; 就不用改&lt;br /&gt;
&lt;br /&gt;
修改后&lt;br /&gt;
&lt;br /&gt;
复制代码块的所有内容 粘贴到ssh里面 按回车就行了&lt;br /&gt;
&lt;br /&gt;
脚本代码块:&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; &#039;EOF&#039; &amp;gt; /root/bwg_monitor.sh&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# ================= 配置区 =================&lt;br /&gt;
VEID=&amp;quot;你的veid&amp;quot;&lt;br /&gt;
API_KEY=&amp;quot;你的api_key&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 预警阈值数组 (百分比)&lt;br /&gt;
NOTIFY_THRESHOLDS=(50 80 90 95)&lt;br /&gt;
&lt;br /&gt;
# Telegram 配置&lt;br /&gt;
TG_BOT_TOKEN=&amp;quot;你的机器人token&amp;quot;&lt;br /&gt;
TG_CHAT_ID=&amp;quot;你的telegram ID&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# (使用 UTC 小时 0-23) 北京时间 19:00 - 08:00 对应 UTC 11:00 - 00:00&lt;br /&gt;
SILENT_UTC_START=11&lt;br /&gt;
SILENT_UTC_END=0&lt;br /&gt;
&lt;br /&gt;
STORAGE_DIR=&amp;quot;$HOME/.cache/bwg_monitor&amp;quot;&lt;br /&gt;
DATA_FILE=&amp;quot;$STORAGE_DIR/usage_data.json&amp;quot;&lt;br /&gt;
LOG_FILE=&amp;quot;$STORAGE_DIR/monitor.log&amp;quot;&lt;br /&gt;
LOG_MAX_LINES=500&lt;br /&gt;
# ==========================================&lt;br /&gt;
&lt;br /&gt;
mkdir -p &amp;quot;$STORAGE_DIR&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# 增强型 JSON 提取函数 (无需 jq, 适配各种空格格式)&lt;br /&gt;
get_json_num() {&lt;br /&gt;
    echo &amp;quot;$1&amp;quot; | grep -o &amp;quot;\&amp;quot;$2\&amp;quot;:[^,}]*&amp;quot; | sed &#039;s/.*://;s/[ &amp;quot;]*//g&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
log_message() {&lt;br /&gt;
    local msg=&amp;quot;$1&amp;quot;&lt;br /&gt;
    local timestamp=$(date &#039;+%Y-%m-%d %H:%M:%S&#039;)&lt;br /&gt;
    echo &amp;quot;$timestamp $msg&amp;quot; &amp;gt;&amp;gt; &amp;quot;$LOG_FILE&amp;quot;&lt;br /&gt;
    # 自动清理旧日志&lt;br /&gt;
    if [ $(wc -l &amp;lt; &amp;quot;$LOG_FILE&amp;quot;) -gt &amp;quot;$LOG_MAX_LINES&amp;quot; ]; then&lt;br /&gt;
        sed -i &amp;quot;1,$((LOG_MAX_LINES/2))d&amp;quot; &amp;quot;$LOG_FILE&amp;quot;&lt;br /&gt;
        echo &amp;quot;$(date &#039;+%Y-%m-%d %H:%M:%S&#039;) [INFO] 日志已自动减半清理。&amp;quot; &amp;gt;&amp;gt; &amp;quot;$LOG_FILE&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
send_tg_msg() {&lt;br /&gt;
    local message=&amp;quot;$1&amp;quot;&lt;br /&gt;
    local is_test_mode=&amp;quot;$2&amp;quot;&lt;br /&gt;
    local silent_param=&amp;quot;&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # 获取当前 UTC 小时&lt;br /&gt;
    local current_utc_hour=$(date -u +%H)&lt;br /&gt;
    current_utc_hour=$((10#$current_utc_hour))&lt;br /&gt;
&lt;br /&gt;
    # --- 跨午夜逻辑判断 ---&lt;br /&gt;
    local is_silent=false&lt;br /&gt;
    if [ &amp;quot;$SILENT_UTC_START&amp;quot; -lt &amp;quot;$SILENT_UTC_END&amp;quot; ]; then&lt;br /&gt;
        # 情况 A: 时间段不跨越午夜 (如 10:00-18:00)&lt;br /&gt;
        if [ &amp;quot;$current_utc_hour&amp;quot; -ge &amp;quot;$SILENT_UTC_START&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$current_utc_hour&amp;quot; -lt &amp;quot;$SILENT_UTC_END&amp;quot; ]; then&lt;br /&gt;
            is_silent=true&lt;br /&gt;
        fi&lt;br /&gt;
    else&lt;br /&gt;
        # 情况 B: 时间段跨越午夜 (如 11:00-00:00)&lt;br /&gt;
        if [ &amp;quot;$current_utc_hour&amp;quot; -ge &amp;quot;$SILENT_UTC_START&amp;quot; ] || [ &amp;quot;$current_utc_hour&amp;quot; -lt &amp;quot;$SILENT_UTC_END&amp;quot; ]; then&lt;br /&gt;
            is_silent=true&lt;br /&gt;
        fi&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    [ &amp;quot;$is_silent&amp;quot; = true ] &amp;amp;&amp;amp; silent_param=&amp;quot;-d disable_notification=true&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # 执行发送&lt;br /&gt;
    local res=$(curl -s -X POST &amp;quot;https://api.telegram.org/bot$TG_BOT_TOKEN/sendMessage&amp;quot; \&lt;br /&gt;
        -d &amp;quot;chat_id=$TG_CHAT_ID&amp;quot; \&lt;br /&gt;
        $silent_param \&lt;br /&gt;
        -d &amp;quot;text=$message&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if [[ &amp;quot;$res&amp;quot; == *&amp;quot;\&amp;quot;ok\&amp;quot;:true&amp;quot;* ]]; then&lt;br /&gt;
        if [[ &amp;quot;$is_test_mode&amp;quot; == &amp;quot;-t&amp;quot; ]]; then&lt;br /&gt;
            echo &amp;quot;✅ Telegram 发送成功！ (静音模式: $is_silent)&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            log_message &amp;quot;[SUCCESS] Telegram 预警已送达 (静音: $is_silent)。&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        return 0&lt;br /&gt;
    else&lt;br /&gt;
        if [[ &amp;quot;$is_test_mode&amp;quot; == &amp;quot;-t&amp;quot; ]]; then&lt;br /&gt;
            echo &amp;quot;❌ Telegram 错误: $res&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            log_message &amp;quot;[ERROR] Telegram 失败: $res&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        return 1&lt;br /&gt;
    fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# --- 处理测试参数 -t ---&lt;br /&gt;
if [[ &amp;quot;$1&amp;quot; == &amp;quot;-t&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;quot;--- 正在进入模拟测试模式 ---&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # 模拟输入值&lt;br /&gt;
    MOCK_PLAN=2147483648000&lt;br /&gt;
    MOCK_USED=77207619653&lt;br /&gt;
    MOCK_MULT=1&lt;br /&gt;
    # 模拟重置时间：当前时间 + 1天 (86400秒)&lt;br /&gt;
    MOCK_NEXT_RESET=$(($(date +%s) + 86400))&lt;br /&gt;
    &lt;br /&gt;
    # 计算逻辑&lt;br /&gt;
    M_PLAN_KB=$(( MOCK_PLAN * MOCK_MULT / 1024 ))&lt;br /&gt;
    M_USED_KB=$(( MOCK_USED * MOCK_MULT / 1024 ))&lt;br /&gt;
    M_USAGE_PERCENT=$(( M_USED_KB * 100 / M_PLAN_KB ))&lt;br /&gt;
    &lt;br /&gt;
    M_USED_GB=$(( M_USED_KB / 1024 / 1024 ))&lt;br /&gt;
    M_TOTAL_GB=$(( M_PLAN_KB / 1024 / 1024 ))&lt;br /&gt;
    M_RESET_DATE=$(date -d @&amp;quot;$MOCK_NEXT_RESET&amp;quot; &#039;+%Y-%m-%d %H:%M&#039;)&lt;br /&gt;
&lt;br /&gt;
    TEST_MSG=&amp;quot;🔔 搬瓦工监控模拟测试&lt;br /&gt;
当前进度: $M_USAGE_PERCENT%&lt;br /&gt;
已用流量: ${M_USED_GB} GB&lt;br /&gt;
总量配额: ${M_TOTAL_GB} GB&lt;br /&gt;
下次重置: $M_RESET_DATE&lt;br /&gt;
------------------&lt;br /&gt;
如果收到此消息，说明 Bot 配置与计算逻辑正常。&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    echo &amp;quot;计算结果: 已用 $M_USAGE_PERCENT% ($M_USED_GB/$M_TOTAL_GB GB)&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    if send_tg_msg &amp;quot;$TEST_MSG&amp;quot;; then&lt;br /&gt;
        echo &amp;quot;✅ 测试成功！请检查 Telegram。&amp;quot;&lt;br /&gt;
    else&lt;br /&gt;
        echo &amp;quot;❌ 测试失败！请检查 Token/ID 或网络连接。&amp;quot;&lt;br /&gt;
    fi&lt;br /&gt;
    &lt;br /&gt;
    echo &amp;quot;--- 测试结束 (数据未保存) ---&amp;quot;&lt;br /&gt;
    exit 0&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# --- 正式运行逻辑 ---&lt;br /&gt;
RESPONSE=$(curl -s -X POST &amp;quot;https://api.64clouds.com/v1/getServiceInfo&amp;quot; -d &amp;quot;veid=$VEID&amp;quot; -d &amp;quot;api_key=$API_KEY&amp;quot;)&lt;br /&gt;
ERROR_CODE=$(get_json_num &amp;quot;$RESPONSE&amp;quot; &amp;quot;error&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
if [[ &amp;quot;$ERROR_CODE&amp;quot; != &amp;quot;0&amp;quot; ]]; then&lt;br /&gt;
    log_message &amp;quot;[ERROR] API 请求失败: $RESPONSE&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# 提取关键数据&lt;br /&gt;
PLAN=$(get_json_num &amp;quot;$RESPONSE&amp;quot; &amp;quot;plan_monthly_data&amp;quot;)&lt;br /&gt;
USED=$(get_json_num &amp;quot;$RESPONSE&amp;quot; &amp;quot;data_counter&amp;quot;)&lt;br /&gt;
MULT=$(get_json_num &amp;quot;$RESPONSE&amp;quot; &amp;quot;monthly_data_multiplier&amp;quot;)&lt;br /&gt;
NEXT_RESET=$(get_json_num &amp;quot;$RESPONSE&amp;quot; &amp;quot;data_next_reset&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 转换 KB 预防 32 位溢出&lt;br /&gt;
PLAN_KB=$(( PLAN * MULT / 1024 ))&lt;br /&gt;
USED_KB=$(( USED * MULT / 1024 ))&lt;br /&gt;
USAGE_PERCENT=$(( USED_KB * 100 / PLAN_KB ))&lt;br /&gt;
&lt;br /&gt;
# 读取历史数据&lt;br /&gt;
HIST_NOTIFIED=$(get_json_num &amp;quot;$(cat &amp;quot;$DATA_FILE&amp;quot; 2&amp;gt;/dev/null || echo &#039;{&amp;quot;notified_level&amp;quot;:-1}&#039;)&amp;quot; &amp;quot;notified_level&amp;quot;)&lt;br /&gt;
HIST_RESET_TS=$(get_json_num &amp;quot;$(cat &amp;quot;$DATA_FILE&amp;quot; 2&amp;gt;/dev/null || echo &#039;{&amp;quot;last_check_ts&amp;quot;:0}&#039;)&amp;quot; &amp;quot;last_check_ts&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# 跨周期重置&lt;br /&gt;
if [[ &amp;quot;$NEXT_RESET&amp;quot; != &amp;quot;$HIST_RESET_TS&amp;quot; ]]; then&lt;br /&gt;
    HIST_NOTIFIED=-1&lt;br /&gt;
    log_message &amp;quot;[INFO] 进入新计费周期。&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
FINAL_NOTIFY_LEVEL=$HIST_NOTIFIED&lt;br /&gt;
for level in &amp;quot;${NOTIFY_THRESHOLDS[@]}&amp;quot;; do&lt;br /&gt;
    if [ &amp;quot;$USAGE_PERCENT&amp;quot; -ge &amp;quot;$level&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$level&amp;quot; -gt &amp;quot;$HIST_NOTIFIED&amp;quot; ]; then&lt;br /&gt;
        USED_GB=$(( USED_KB / 1024 / 1024 ))&lt;br /&gt;
        TOTAL_GB=$(( PLAN_KB / 1024 / 1024 ))&lt;br /&gt;
        RESET_DATE=$(date -d @&amp;quot;$NEXT_RESET&amp;quot; &#039;+%Y-%m-%d %H:%M&#039;)&lt;br /&gt;
        &lt;br /&gt;
        MSG=&amp;quot;🚨 搬瓦工流量预警&lt;br /&gt;
进度: $USAGE_PERCENT%&lt;br /&gt;
已用: ${USED_GB} GB&lt;br /&gt;
总量: ${TOTAL_GB} GB&lt;br /&gt;
重置日期: $RESET_DATE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        if send_tg_msg &amp;quot;$MSG&amp;quot;; then&lt;br /&gt;
            FINAL_NOTIFY_LEVEL=$level&lt;br /&gt;
            log_message &amp;quot;[SUCCESS] 发送 $level% 通知。&amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
    fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
# 保存状态&lt;br /&gt;
echo &amp;quot;{\&amp;quot;total_usage_kb\&amp;quot;:$USED_KB,\&amp;quot;last_check_ts\&amp;quot;:$NEXT_RESET,\&amp;quot;notified_level\&amp;quot;:$FINAL_NOTIFY_LEVEL}&amp;quot; &amp;gt; &amp;quot;$DATA_FILE&amp;quot;&lt;br /&gt;
log_message &amp;quot;[INFO] 检查完毕: $USAGE_PERCENT%&amp;quot;&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 授予执行权限 ====&lt;br /&gt;
输入 &amp;lt;code&amp;gt;chmod +x /root/bwg_monitor.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后输入 &amp;lt;code&amp;gt;ls -l /root/bwg_monitor.sh&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果像蓝色框框 有x就说明有执行权限了 如果是红色的-就说明还没执行的权限[[File:Chmod1.png|border]]&lt;br /&gt;
&lt;br /&gt;
==== 测试telegram推送 ====&lt;br /&gt;
输入 &amp;lt;code&amp;gt;/root/bwg_monitor.sh -t&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Telegramsend.png|border]]&lt;br /&gt;
&lt;br /&gt;
[[File:Telegramtest.png|border]]&lt;br /&gt;
&lt;br /&gt;
如下是失败了 你的bot token或 chat_id 不正确&lt;br /&gt;
&lt;br /&gt;
[[File:Telegramsenderror.png|border]]&lt;br /&gt;
&lt;br /&gt;
正常就可以配置开机自动启动了&lt;br /&gt;
&lt;br /&gt;
=== 配置开机自动启动 ===&lt;br /&gt;
&lt;br /&gt;
=== 第一步：创建 Service 文件 ===&lt;br /&gt;
这个文件告诉系统“要运行什么”。&lt;br /&gt;
&lt;br /&gt;
这里你也可以去 &amp;lt;code&amp;gt;ls /etc/systemd/system/bwg-monitor.service&amp;lt;/code&amp;gt;  检查一下这个文件是否存在防止被覆盖... 但一般不会有吧.... 如果存在就 把 &amp;lt;code&amp;gt;/etc/systemd/system/bwg-monitor.service&amp;lt;/code&amp;gt;改成&amp;lt;code&amp;gt;/etc/systemd/system/bwg-monitor1.service&amp;lt;/code&amp;gt;之类的 只改最后一个/ 后面 和 . 之前的 就是 /etc/systemd/system/这里可以修改.service&lt;br /&gt;
&lt;br /&gt;
如果你修改了 下面的也要改 并且要一样才行&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
替换你的实际文件名和路径 &lt;br /&gt;
&lt;br /&gt;
ExecStart=/bin/bash /root/bwg_monitor.sh 如果你上面没改 那就这样就行&lt;br /&gt;
&lt;br /&gt;
bwg_monitor.sh 是你的文件名&lt;br /&gt;
&lt;br /&gt;
/root/ 代表是 / 目录下的 root 目录 下的 bwg_monitor.sh 文件&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; &#039;EOF&#039; &amp;gt; /etc/systemd/system/bwg-monitor.service&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=BandwagonHost Traffic Monitor Service&lt;br /&gt;
After=network.target&lt;br /&gt;
&lt;br /&gt;
[Service]&lt;br /&gt;
Type=oneshot&lt;br /&gt;
# 替换为你的实际文件名&lt;br /&gt;
ExecStart=/bin/bash /root/bwg_monitor.sh&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 第二步：创建 Timer 文件 ===&lt;br /&gt;
这个文件告诉系统“什么时候运行”。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;/etc/systemd/system/bwg-monitor.timer&amp;lt;/code&amp;gt;同上你可以检查一下&lt;br /&gt;
&lt;br /&gt;
如果你修改了文件名 需要注意的是 两个文件名的名字需要一致 &amp;lt;code&amp;gt;bwg-a.timer&amp;lt;/code&amp;gt;  &amp;lt;code&amp;gt;bwg-a.service&amp;lt;/code&amp;gt;  .timer和.service 之前的那个文件名&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
有几个可以修改的地方&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; 开机后 2 分钟开始第一次执行 &lt;br /&gt;
&lt;br /&gt;
OnBootSec=2min &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; 之后每隔 1 小时执行一次 &lt;br /&gt;
&lt;br /&gt;
OnUnitActiveSec=1h &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; 如果关机错过了时间，开机后立刻补跑 &lt;br /&gt;
&lt;br /&gt;
Persistent=true&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; &#039;EOF&#039; &amp;gt; /etc/systemd/system/bwg-monitor.timer&lt;br /&gt;
[Unit]&lt;br /&gt;
Description=Run BandwagonHost Traffic Monitor every hour&lt;br /&gt;
&lt;br /&gt;
[Timer]&lt;br /&gt;
# 开机后 2 分钟开始第一次执行&lt;br /&gt;
OnBootSec=2min&lt;br /&gt;
# 之后每隔 1 小时执行一次&lt;br /&gt;
OnUnitActiveSec=1h&lt;br /&gt;
# 如果关机错过了时间，开机后立刻补跑&lt;br /&gt;
Persistent=true&lt;br /&gt;
&lt;br /&gt;
[Install]&lt;br /&gt;
WantedBy=timers.target&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 第三步：启动并激活 ===&lt;br /&gt;
在终端执行以下命令：&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 重新加载配置&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&lt;br /&gt;
# 启动定时器并设置为开机自启&lt;br /&gt;
systemctl enable --now bwg-monitor.timer&lt;br /&gt;
&lt;br /&gt;
# 查看定时器状态&lt;br /&gt;
systemctl status bwg-monitor.timer&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;[[File:Systemctlstatusbwg.png|border]]&lt;br /&gt;
&lt;br /&gt;
蓝色框框说明是定时器已经正常运行&lt;br /&gt;
&lt;br /&gt;
红色框框是已经开启了 自动开机启动&lt;br /&gt;
&lt;br /&gt;
绿色的框框代表service正在等待 只要不是红色的就行了&lt;br /&gt;
&lt;br /&gt;
=== 缓存和日志的存储位置 ===&lt;br /&gt;
在 默认位置在 &#039;&#039;&#039;$HOME/.cache/bwg_monitor/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
如果你是按照本文来的那$HOME就是/root 完整路径就是 &#039;&#039;&#039;/root/.cache/bwg_monitor/&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:Store.png|border]]&lt;br /&gt;
&lt;br /&gt;
monitor.log是执行过程记录的日志&lt;br /&gt;
&lt;br /&gt;
usage_data.json是缓存信息&lt;br /&gt;
&lt;br /&gt;
如果需要重复测试的话 需要删除usage_data.json缓存信息 &lt;br /&gt;
&lt;br /&gt;
如果你按照本文的来的话切换了root账户&lt;br /&gt;
&lt;br /&gt;
就输入 &amp;lt;code&amp;gt;rm /root/.cache/bwg_monitor/usage_data.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果你不是root账户的话  就用这个 &amp;lt;code&amp;gt;rm $HOME/.cache/bwg_monitor/usage_data.json&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
如果出现错误和非预期情况请检查 &amp;lt;code&amp;gt;cat $HOME/.cache/bwg_monitor/monitor.log&amp;lt;/code&amp;gt;的信息&lt;br /&gt;
&lt;br /&gt;
注：流量重置时间是根据实例的精确创建时间计算得来的，如在 8日 01:02:03 +0800创建实例，则理论上会在下一个月的同一时间重置流量。但由于官方使用的时区是太平洋时间，流量重置时间会在冬令时和夏令时切换后有一小时的偏移。&lt;br /&gt;
[[index.php?title=Category:500 常见应用指南 — Application Guides]]&lt;/div&gt;</summary>
		<author><name>Horrself</name></author>
	</entry>
	<entry>
		<id>https://md5.pw/index.php?title=%E6%90%AC%E7%93%A6%E5%B7%A5_KiwiVM_%E9%9D%A2%E6%9D%BF_Audit_log%EF%BC%88%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97%EF%BC%89%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3&amp;diff=1355</id>
		<title>搬瓦工 KiwiVM 面板 Audit log（审计日志）功能详解</title>
		<link rel="alternate" type="text/html" href="https://md5.pw/index.php?title=%E6%90%AC%E7%93%A6%E5%B7%A5_KiwiVM_%E9%9D%A2%E6%9D%BF_Audit_log%EF%BC%88%E5%AE%A1%E8%AE%A1%E6%97%A5%E5%BF%97%EF%BC%89%E5%8A%9F%E8%83%BD%E8%AF%A6%E8%A7%A3&amp;diff=1355"/>
		<updated>2026-02-05T20:35:24Z</updated>

		<summary type="html">&lt;p&gt;Horrself：​添加关于夏令时/冬令时切换的注释&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;审计日志是 KiwiVM 面板提供的一项核心安全监控功能，它充当了服务器运维过程中的“记录仪”。通过该功能，管理员可以清晰的查看到所有通过管理面板下达的指令，这对于维护多用户环境下的账户安全以及追溯系统变更记录至关重要。&lt;br /&gt;
&lt;br /&gt;
== 一、 Audit log 功能定位与访问路径 ==&lt;br /&gt;
&lt;br /&gt;
在日常维护 VPS 时，了解谁在什么时候操作了服务器是基础安全要求。Audit log 功能被收纳在 KiwiVM 面板左侧菜单栏的 “Security &amp;amp; Records” 分类中。该功能属于系统底层日志，用户无需进行任何额外配置，系统会自动静默记录所有操作轨迹。&lt;br /&gt;
&lt;br /&gt;
[[File:Bwg-kiwivm-audit-log-entry.png|thumb|center|800px|alt=搬瓦工 KiwiVM 面板审计日志菜单位置|审计日志位于安全与记录分类下，是排查账户异常的首选工具]]&lt;br /&gt;
&lt;br /&gt;
== 二、 Audit log 界面参数与时区识别逻辑 ==&lt;br /&gt;
&lt;br /&gt;
Audit log 界面设计非常精简，旨在提供最高效的数据检索。页面顶部会显示系统自动识别的浏览器时区，这一机制确保了日志中的时间戳能够与管理员的本地操作时间完全对应，极大的方便了跨时区运维工作。&lt;br /&gt;
&lt;br /&gt;
[[File:Bwg-audit-log-timezone-info.png|thumb|center|800px|alt=搬瓦工审计日志时区自动识别显示|系统会自动识别当前环境时区（如 Asia/Shanghai），使日志时间更具参考价值]]&lt;br /&gt;
&lt;br /&gt;
在审计日志的表格中，每一行记录都包含以下三个核心要素，它们共同构成了完整的操作证据链：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 参数名称 !! 详细功能定义&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Time&#039;&#039;&#039; || 记录操作发生的精确时刻，精确到秒级，并包含时区偏差信息。&lt;br /&gt;
需要注意的是，对于拥有冬令时 &amp;amp; 夏令时的时区，会在相应时间进行切换，这可能导致时区上的理解误差。&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;IP address&#039;&#039;&#039; || 发起操作请求的源 IP 地址。管理员可以通过此项判断是否存在非授权的异地登录。&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Action&#039;&#039;&#039; || 对该次操作的具体行为描述，是判定用户执行了何种指令的关键字段。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 三、 Audit log 常见审计记录行为词典 ==&lt;br /&gt;
&lt;br /&gt;
为了帮助管理员快速读懂全英文的操作记录，下表整理了审计日志中最高频出现的动作指令及其对应的中文含义。掌握这些术语有助于在查阅冗长日志时迅速定位关键事件。&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 操作行为!! 中文功能说明&lt;br /&gt;
|-&lt;br /&gt;
| Control panel: successful login || 管理员已成功登录进入 KiwiVM 控制面板。&lt;br /&gt;
|-&lt;br /&gt;
| Billing platform requested a single-use login token || 从官网财务后台跳转进入时，系统自动生成的安全登录令牌。&lt;br /&gt;
|-&lt;br /&gt;
| Root password was reset || 执行了 Root 初始密码重置操作。&lt;br /&gt;
|-&lt;br /&gt;
| OS Reinstall || 执行了“重装系统”任务，日志通常会附带具体的系统版本。&lt;br /&gt;
|-&lt;br /&gt;
| VNC console started || 启动了 Web 端的 VNC 交互式控制台。&lt;br /&gt;
|-&lt;br /&gt;
| Migration from [机房A] to [机房B] || 记录了服务器在不同数据中心之间的“切换机房”轨迹。&lt;br /&gt;
|-&lt;br /&gt;
| Create / Delete / Export snapshot || 涉及到备份（快照）的创建、删除或导出为本地文件的操作。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 四、 审计日志（Audit log）安全实战：还原操作轨迹 ==&lt;br /&gt;
&lt;br /&gt;
审计日志不仅是历史记录的堆砌，更是账号安全防御的重要环。通过对 IP 地址和操作类型的交叉比对，管理员可以实现对 VPS 账户的深层次安全审计，还原出一台服务器从创建到运维的完整生命周期。&lt;br /&gt;
&lt;br /&gt;
[[File:Bwg-audit-log-sequence.png|thumb|center|800px|alt=搬瓦工审计日志历史轨迹还原演示|通过审计日志可以清晰复盘管理员的操作序列]]&lt;br /&gt;
&lt;br /&gt;
通过下表我们可以看到一个典型的安全审计案例，展示了如何利用日志发现系统变更：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! 操作时间 (2025年) !! 发起 IP !! 操作行为说明&lt;br /&gt;
|-&lt;br /&gt;
| Dec 27, 21:11:45 || xxx.xx.xxx.xx || &#039;&#039;&#039;成功登录面板&#039;&#039;&#039;：管理员进入 KiwiVM 面板。&lt;br /&gt;
|-&lt;br /&gt;
| Dec 26, 22:04:45 || xxx.xx.xxx.xx || &#039;&#039;&#039;启动 VNC 终端&#039;&#039;&#039;：排查系统故障及查看日志记录。&lt;br /&gt;
|-&lt;br /&gt;
| Dec 24, 12:36:40 || xxx.xx.xxx.xx || &#039;&#039;&#039;重置 Root 密码&#039;&#039;&#039;：执行了系统最高权限变更记录。&lt;br /&gt;
|-&lt;br /&gt;
| Sep 24, 18:53:27 || xxx.xx.xxx.xx || &#039;&#039;&#039;机房迁移&#039;&#039;&#039;：执行了更换机房操作。&lt;br /&gt;
|-&lt;br /&gt;
| Sep 15, 19:24:52 || xxx.xx.xxx.xx || &#039;&#039;&#039;重装系统&#039;&#039;&#039;：成功部署了 Debian 13 环境。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 五、 127.0.0.1 内部记录解析 ==&lt;br /&gt;
&lt;br /&gt;
在查阅审计日志时，IP 地址 127.0.0.1 经常伴随“Billing platform requested a single-use login token”出现。这并非异常登录，而是搬瓦工官方系统的安全验证机制。当用户在官网后台管理界面点击进入 KiwiVM 时，系统会通过本地环回地址发起令牌请求，这代表该次访问是合法的官方跳转。&lt;br /&gt;
&lt;br /&gt;
[[File:Bwg-audit-log-internal-token.png|thumb|center|800px|alt=审计日志中 127.0.0.1 内部令牌记录解析|显示为 127.0.0.1 的记录属于官方系统握手，用户无需为此产生安全焦虑]]&lt;br /&gt;
&lt;br /&gt;
== 六、 运维建议与总结 ==&lt;br /&gt;
&lt;br /&gt;
综上所述，Audit log 是每一位搬瓦工用户都应掌握的工具。它将复杂的系统后台行为转化为清晰的时间轴，为用户提供了极高的数据透明度。&lt;br /&gt;
&lt;br /&gt;
建议管理员在进行重大运维操作（如修改密码、迁移数据中心）后，习惯性的进入审计日志页面进行核对。这不仅能确认操作是否已成功生效，还能在向技术支持寻求帮助时，提供精准的操作时间戳作为证据。养成定期审计日志的习惯，是保障服务器长期稳定运行的关键环节。&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=Category:200 KiwiVM 简介 — KiwiVM Introduction]]&lt;/div&gt;</summary>
		<author><name>Horrself</name></author>
	</entry>
</feed>