编写Bash实现Linux网络流量监控统计,无需额外工具

server/2025/2/11 6:08:31/

项目需求:

编写Linux脚本,运行后可以统计所有网口的流量汇总数据,对出口流量区分内网流量和公网流量,并自动保存到日志文件。

运行效果:

完整代码:

#!/bin/bash# 日志文件路径
LOG_FILE="/var/log/network_traffic.log"# 定义内网网段
PRIVATE_NETS=("10.0.0.0/8" "172.16.0.0/12" "192.168.0.0/16")# 获取当前时间
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")# 初始化流量统计变量
TOTAL_RX=0
TOTAL_TX=0
INTERNAL_TX=0
EXTERNAL_TX=0# 判断一个 IP 是否属于内网
function is_private_ip {local IP=$1IFS='.' read -r -a OCTETS <<< "$IP"# 10.0.0.0/8if [[ ${OCTETS[0]} -eq 10 ]]; thenreturn 0fi# 172.16.0.0/12if [[ ${OCTETS[0]} -eq 172 && ${OCTETS[1]} -ge 16 && ${OCTETS[1]} -le 31 ]]; thenreturn 0fi# 192.168.0.0/16if [[ ${OCTETS[0]} -eq 192 && ${OCTETS[1]} -eq 168 ]]; thenreturn 0fi# 其他情况为公网 IPreturn 1
}# 获取所有网络接口的名称
INTERFACES=$(ip -o link show | awk -F': ' '{print $2}')# 日志文件头部信息
echo "===== Network Traffic Report at $TIMESTAMP =====" >> $LOG_FILE# 遍历每个网络接口,获取流量数据
for IFACE in $INTERFACES; do# 获取接收和发送的字节数RX_BYTES=$(cat /sys/class/net/$IFACE/statistics/rx_bytes 2>/dev/null)TX_BYTES=$(cat /sys/class/net/$IFACE/statistics/tx_bytes 2>/dev/null)# 如果接口没有流量数据,跳过if [[ -z "$RX_BYTES" || -z "$TX_BYTES" ]]; thencontinuefi# 累加总流量TOTAL_RX=$((TOTAL_RX + RX_BYTES))TOTAL_TX=$((TOTAL_TX + TX_BYTES))# 使用 nstat 获取当前接口的流量数据NSTAT_OUTPUT=$(nstat -a)# 提取发送到内网和外网的流量INTERNAL_TX_IFACE=0EXTERNAL_TX_IFACE=0# 遍历路由表,判断流量是发送到内网还是外网while read -r ROUTE; doDEST_IP=$(echo "$ROUTE" | awk '{print $1}')if is_private_ip "$DEST_IP"; thenINTERNAL_TX_IFACE=$((INTERNAL_TX_IFACE + TX_BYTES))elseEXTERNAL_TX_IFACE=$((EXTERNAL_TX_IFACE + TX_BYTES))fidone <<< "$(ip route show)"# 累加内网和外网流量INTERNAL_TX=$((INTERNAL_TX + INTERNAL_TX_IFACE))EXTERNAL_TX=$((EXTERNAL_TX + EXTERNAL_TX_IFACE))# 将流量转换为更易读的单位(KB, MB, GB)function convert_bytes {local BYTES=$1if (( BYTES >= 1024**3 )); thenecho "$(echo "scale=2; $BYTES / (1024^3)" | bc) GB"elif (( BYTES >= 1024**2 )); thenecho "$(echo "scale=2; $BYTES / (1024^2)" | bc) MB"elif (( BYTES >= 1024 )); thenecho "$(echo "scale=2; $BYTES / 1024" | bc) KB"elseecho "$BYTES Bytes"fi}# 转换当前接口的流量RX_READABLE=$(convert_bytes $RX_BYTES)TX_READABLE=$(convert_bytes $TX_BYTES)# 记录当前接口的流量到日志文件echo "Interface: $IFACE, RX: $RX_READABLE, TX: $TX_READABLE" >> $LOG_FILE
done# 转换总流量
TOTAL_RX_READABLE=$(convert_bytes $TOTAL_RX)
TOTAL_TX_READABLE=$(convert_bytes $TOTAL_TX)
INTERNAL_TX_READABLE=$(convert_bytes $INTERNAL_TX)
EXTERNAL_TX_READABLE=$(convert_bytes $EXTERNAL_TX)# 记录总流量到日志文件
echo "---------------------------------------------" >> $LOG_FILE
echo "Total Traffic: RX: $TOTAL_RX_READABLE, TX: $TOTAL_TX_READABLE" >> $LOG_FILE
echo "Internal Traffic (TX): $INTERNAL_TX_READABLE" >> $LOG_FILE
echo "External Traffic (TX): $EXTERNAL_TX_READABLE" >> $LOG_FILE
echo "" >> $LOG_FILE# 输出结果到控制台
echo "Traffic data saved to $LOG_FILE"
echo "===== Network Traffic Report at $TIMESTAMP ====="
for IFACE in $INTERFACES; doRX_BYTES=$(cat /sys/class/net/$IFACE/statistics/rx_bytes 2>/dev/null)TX_BYTES=$(cat /sys/class/net/$IFACE/statistics/tx_bytes 2>/dev/null)if [[ -n "$RX_BYTES" && -n "$TX_BYTES" ]]; thenRX_READABLE=$(convert_bytes $RX_BYTES)TX_READABLE=$(convert_bytes $TX_BYTES)echo "Interface: $IFACE, RX: $RX_READABLE, TX: $TX_READABLE"fi
done
echo "---------------------------------------------"
echo "Total Traffic: RX: $TOTAL_RX_READABLE, TX: $TOTAL_TX_READABLE"
echo "Internal Traffic (TX): $INTERNAL_TX_READABLE"
echo "External Traffic (TX): $EXTERNAL_TX_READABLE"


http://www.ppmy.cn/server/166677.html

相关文章

[概率论] 随机变量

Kolmogorov 定义的随机变量是基于测度论和实变函数的。这是因为随机变量的概念需要精确地定义其可能的取值、发生的概率以及这些事件之间的依赖关系。 测度论&#xff1a;在数学中&#xff0c;测度论是用来研究集合大小的理论&#xff0c;特别是无穷可数集和无界集的大小。对于…

Kotlin 2.1.0 入门教程(十三)异常、Nothing

创建自定义异常 可以通过创建继承内置 Exception 类来定义自定义异常。这允许你创建更符合应用程序需求的特定错误类型。 要创建一个自定义异常&#xff0c;可以定义一个继承 Exception 的类&#xff1a; class MyException : Exception("My message")在这个例子中…

【对比测评】 .NET 应用的 Web 视图控件:DotNetBrowser 或 EO.WebBrowser

您是否需要 .NET 应用的 Web 视图控件&#xff1f;.NET 生态系统提供了很多东西&#xff0c;有免费的 Web 视图控件&#xff0c;既有开源的&#xff0c;也有专有的。还有一些商业 Web 视图 控件&#xff0c;也是企业经常选择的一种选项。 在这篇博文中&#xff0c;我们比较了商…

RabbitMQ 如何设置限流?

RabbitMQ 的限流&#xff08;流量控制&#xff09;主要依赖于 QoS&#xff08;Quality of Service&#xff09; 机制&#xff0c;即 prefetch count 参数。这个参数控制每个消费者一次最多能获取多少条未确认的消息&#xff0c;从而避免某个消费者被大量消息压垮。 1. RabbitMQ…

[Redis] Redis分布式锁与常见面试题

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Qt、C++软件开发之QVedioWidget控件:功能特性以及C++详细用法。

文章目录 前言特性用法创建 QVideoWidget 实例‌:设置视频源‌:处理事件‌:全屏显示‌:自定义外观‌:注意事项前言 在Qt软件开发中,QVideoWidget 是一个用于显示视频内容的控件,是QWidget的子类。它是Qt Multimedia模块的一部分,提供了将视频输出渲染到窗口或屏幕上的…

从云原生到 AI 原生,谈谈我经历的网关发展历程和趋势

作者&#xff1a;谢吉宝&#xff08;唐三&#xff09; 编者按&#xff1a; 云原生 API 网关系列教程即将推出&#xff0c;欢迎文末查看教程内容。本文整理自阿里云智能集团资深技术专家&#xff0c;云原生产品线中间件负责人谢吉宝&#xff08;唐三&#xff09; 在云栖大会的精…

【实战】excel分页写入导出大文件

类 RequestMapping("export")ResponseBodypublic void export(HttpServletResponse response) {long start System.currentTimeMillis();QueryVo query new QueryVo();// response响应头setResponseHeader(response, "excel");ExcelWriter writer Excel…