本文目录导读:

我来帮你写一个统计网络使用量的脚本,这里提供几个不同平台的版本:
Linux Shell 脚本
基础版(统计接口流量)
#!/bin/bash
# 网络流量统计脚本
# 使用方法: ./network_stats.sh [接口名]
INTERFACE=${1:-eth0} # 默认统计 eth0
# 获取当前流量数据
get_traffic() {
local rx=$(cat /sys/class/net/$INTERFACE/statistics/rx_bytes)
local tx=$(cat /sys/class/net/$INTERFACE/statistics/tx_bytes)
echo "$rx $tx"
}
# 格式化字节数
format_bytes() {
local bytes=$1
if [ $bytes -lt 1024 ]; then
echo "${bytes}B"
elif [ $bytes -lt 1048576 ]; then
echo "$((bytes / 1024))KB"
elif [ $bytes -lt 1073741824 ]; then
echo "$((bytes / 1048576))MB"
else
echo "$((bytes / 1073741824))GB"
fi
}
# 主循环
echo "统计接口: $INTERFACE"
echo "按 Ctrl+C 退出"
echo "------------------------"
# 获取初始值
read rx1 tx1 <<< $(get_traffic)
sleep 1
while true; do
read rx2 tx2 <<< $(get_traffic)
# 计算速率 (bytes/s)
rx_speed=$((rx2 - rx1))
tx_speed=$((tx2 - tx1))
# 转换为可读格式
rx_format=$(format_bytes $rx_speed)
tx_format=$(format_bytes $tx_speed)
clear
echo "网络流量统计 (按 Ctrl+C 退出)"
echo "接口: $INTERFACE"
echo "------------------------"
echo "下载速率: ${rx_format}/s"
echo "上传速率: ${tx_format}/s"
echo "------------------------"
echo "总下载: $(format_bytes $rx2)"
echo "总上传: $(format_bytes $tx2)"
rx1=$rx2
tx1=$tx2
sleep 1
done
进阶版(增强功能)
#!/bin/bash
# 增强版网络流量统计脚本
# 功能:实时监控、日志记录、阈值告警
LOG_FILE="/var/log/network_stats.log"
THRESHOLD_HIGH=10485760 # 10MB/s 告警阈值
# 获取所有网络接口
get_interfaces() {
ls /sys/class/net/ | grep -v lo
}
# 初始化统计
init_stats() {
declare -gA rx_start tx_start
for iface in $(get_interfaces); do
rx_start[$iface]=$(cat /sys/class/net/$iface/statistics/rx_bytes)
tx_start[$iface]=$(cat /sys/class/net/$iface/statistics/tx_bytes)
done
}
# 主监控函数
monitor() {
echo "开始监控网络流量..."
echo "时间: $(date '+%Y-%m-%d %H:%M:%S')" | tee -a $LOG_FILE
init_stats
sleep 1
while true; do
local timestamp=$(date '+%H:%M:%S')
clear
echo "网络流量实时监控"
echo "时间: $timestamp"
echo "========================="
for iface in $(get_interfaces); do
local rx_now=$(cat /sys/class/net/$iface/statistics/rx_bytes)
local tx_now=$(cat /sys/class/net/$iface/statistics/tx_bytes)
local rx_speed=$((rx_now - rx_start[$iface]))
local tx_speed=$((tx_now - tx_start[$iface]))
# 检测是否超过阈值
if [ $rx_speed -gt $THRESHOLD_HIGH ]; then
echo "⚠️ $iface 下载速率过高: $(echo $rx_speed | numfmt --to=iec)/s"
fi
echo "接口: $iface"
echo " ↓ 下载: $(numfmt --to=iec $rx_speed)/s"
echo " ↑ 上传: $(numfmt --to=iec $tx_speed)/s"
echo "---"
# 更新起始值
rx_start[$iface]=$rx_now
tx_start[$iface]=$tx_now
# 记录日志
echo "$timestamp,$iface,$rx_speed,$tx_speed" >> $LOG_FILE
done
sleep 1
done
}
# 生成报告
generate_report() {
echo "=== 网络使用报告 ==="
echo "统计周期: $(date -d @$(head -1 $LOG_FILE | cut -d',' -f1) '+%H:%M:%S') - $(date '+%H:%M:%S')"
local total_rx=0
local total_tx=0
for iface in $(get_interfaces); do
local rx=$(cat /sys/class/net/$iface/statistics/rx_bytes)
local tx=$(cat /sys/class/net/$iface/statistics/tx_bytes)
echo "接口: $iface"
echo " 总下载: $(numfmt --to=iec $rx)"
echo " 总上传: $(numfmt --to=iec $tx)"
total_rx=$((total_rx + rx))
total_tx=$((total_tx + tx))
done
echo "总计:"
echo " 总下载: $(numfmt --to=iec $total_rx)"
echo " 总上传: $(numfmt --to=iec $total_tx)"
}
# 命令行参数处理
case "$1" in
monitor)
monitor
;;
report)
generate_report
;;
*)
echo "使用方法: $0 {monitor|report}"
echo " monitor - 实时监控网络流量"
echo " report - 生成网络使用报告"
;;
esac
Python 脚本
#!/usr/bin/env python3
import psutil
import time
import sys
from datetime import datetime
class NetworkMonitor:
def __init__(self):
self.old_stats = {}
self.new_stats = {}
def get_network_stats(self):
"""获取网络接口统计"""
net_io = psutil.net_io_counters(pernic=True)
stats = {}
for interface, data in net_io.items():
if interface != 'lo': # 排除回环接口
stats[interface] = {
'bytes_sent': data.bytes_sent,
'bytes_recv': data.bytes_recv,
'packets_sent': data.packets_sent,
'packets_recv': data.packets_recv,
'errin': data.errin,
'errout': data.errout,
'dropin': data.dropin,
'dropout': data.dropout
}
return stats
def format_bytes(self, bytes_val):
"""格式化字节数"""
for unit in ['B', 'KB', 'MB', 'GB', 'TB']:
if bytes_val < 1024.0:
return f"{bytes_val:.2f} {unit}"
bytes_val /= 1024.0
return f"{bytes_val:.2f} PB"
def calculate_speed(self, interface):
"""计算传输速率"""
if interface in self.old_stats and interface in self.new_stats:
old = self.old_stats[interface]
new = self.new_stats[interface]
time_diff = self.time_diff
rx_speed = (new['bytes_recv'] - old['bytes_recv']) / time_diff
tx_speed = (new['bytes_sent'] - old['bytes_sent']) / time_diff
return rx_speed, tx_speed
return 0, 0
def display_stats(self, interfaces=None):
"""显示网络统计"""
os.system('clear' if sys.platform == 'linux' else 'cls')
print(f"\n{'='*60}")
print(f"网络流量监控 - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print(f"{'='*60}")
self.new_stats = self.get_network_stats()
if self.old_stats:
for interface in self.new_stats:
if interfaces and interface not in interfaces:
continue
rx_speed, tx_speed = self.calculate_speed(interface)
current = self.new_stats[interface]
print(f"\n接口: {interface}")
print(f" {'↓ 下载:':<12} {self.format_bytes(rx_speed)}/s")
print(f" {'↑ 上传:':<12} {self.format_bytes(tx_speed)}/s")
print(f" {'总下载:':<12} {self.format_bytes(current['bytes_recv'])}")
print(f" {'总上传:':<12} {self.format_bytes(current['bytes_sent'])}")
# 显示错误/丢包信息
if current['errin'] > 0 or current['errout'] > 0:
print(f" ⚠️ 错误: RX {current['errin']}, TX {current['errout']}")
if current['dropin'] > 0 or current['dropout'] > 0:
print(f" ⚠️ 丢包: RX {current['dropin']}, TX {current['dropout']}")
self.old_stats = self.new_stats
def monitor(self, interval=1, interfaces=None):
"""实时监控"""
try:
print("开始监控... (按 Ctrl+C 退出)")
time.sleep(1)
while True:
self.time_diff = interval
self.display_stats(interfaces)
time.sleep(interval)
except KeyboardInterrupt:
print("\n\n监控已停止")
self.save_report()
def save_report(self):
"""保存使用报告"""
if self.new_stats:
report_file = f"network_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.txt"
with open(report_file, 'w') as f:
f.write("=== 网络使用报告 ===\n")
f.write(f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
f.write("=" * 40 + "\n\n")
for interface, stats in self.new_stats.items():
f.write(f"接口: {interface}\n")
f.write(f" 总下载: {self.format_bytes(stats['bytes_recv'])}\n")
f.write(f" 总上传: {self.format_bytes(stats['bytes_sent'])}\n")
f.write(f" 总数据包: {stats['packets_recv'] + stats['packets_sent']}\n\n")
print(f"报告已保存: {report_file}")
def main():
import os
monitor = NetworkMonitor()
if len(sys.argv) > 1:
if sys.argv[1] == '--help' or sys.argv[1] == '-h':
print("使用方法: python network_monitor.py [选项]")
print("选项:")
print(" -i, --interface 指定监控接口 (逗号分隔)")
print(" -t, --time 更新时间间隔 (秒)")
print(" 示例: python network_monitor.py -i eth0,wlan0 -t 2")
return
# 解析参数
interfaces = None
interval = 1
for i, arg in enumerate(sys.argv):
if arg in ['-i', '--interface'] and i + 1 < len(sys.argv):
interfaces = sys.argv[i + 1].split(',')
elif arg in ['-t', '--time'] and i + 1 < len(sys.argv):
interval = float(sys.argv[i + 1])
monitor.monitor(interval, interfaces)
else:
monitor.monitor()
if __name__ == "__main__":
main()
安装和使用
Linux Shell 脚本
# 保存脚本 chmod +x network_stats.sh # 运行 ./network_stats.sh eth0 # 监控指定接口 ./network_stats.sh # 默认监控 eth0
Python 脚本
# 安装依赖 pip install psutil # 运行 python network_monitor.py # 监控所有接口 python network_monitor.py -i eth0,wlan0 # 监控指定接口 python network_monitor.py -t 2 # 每2秒更新
功能特点
- 实时监控: 实时显示上传/下载速率
- 多接口支持: 可以同时监控多个网络接口
- 日志记录: 记录历史数据用于分析
- 告警功能: 检测异常流量并告警
- 报告生成: 生成使用情况报告
选择适合你需求的版本,根据需要修改参数即可!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播