开发工具

Shell 检测地址丢包率?

上一节:如何设置邮件通知?下一节:

以下是一个用于检测网络地址丢包率的Shell脚本示例,支持自定义检测次数与阈值,并提供详细解释:

脚本功能

1、发送指定次数的Ping包检测目标地址

2、计算丢包率百分比

3、支持阈值告警(如丢包率>5%时触发)

4、兼容Linux和macOS系统


脚本代码

#!/bin/bash
# 用法:./check_packet_loss.sh <目标地址> [检测次数] [告警阈值]

# 参数设置
target1=${1:-"8.8.8.8"}    # 默认检测Google DNS
count=${2:-10}            # 默认发送10个包
threshold=${3:-5}         # 默认丢包率告警阈值5%

# 执行Ping并捕获输出
ping_output=$(ping -c $count $target 2>&1)

# 解析丢包率(兼容不同系统)
if [[ "$ping_output" =~ ([0-9]+)% packet loss ]]; then
    loss_percent=${BASH_REMATCH[1]}
else
    # 若无法解析丢包率,则认为100%丢包(目标不可达)
    loss_percent=100
fi

# 输出结果
echo "目标地址: $target"
echo "检测次数: $count"
echo "丢包率  : ${loss_percent}%"

# 触发告警
if [ $loss_percent -gt $threshold ]; then
    echo "[警告] 丢包率超过阈值 ${threshold}%!"
    # 此处可添加邮件/钉钉通知(参考之前的邮件配置)
    # echo "报警信息" | mail -s "网络异常" admin@example.com
fi


使用示例

# 默认检测8.8.8.8,发10个包,阈值5%
./check_packet_loss.sh

# 检测百度,发20个包,阈值10%
./check_packet_loss.sh www.baidu.com 20 10


关键代码解析

1、参数处理

target1=${1:-"8.8.8.8"}  # $1为第一个参数,未指定时用默认值

使用:-语法为参数提供默认值


2、Ping命令执行

ping -c $count $target 2>&1

-c指定发送包数量

2>&1将错误输出合并到标准输出


3、正则解析丢包率

[[ "$ping_output" =~ ([0-9]+)% packet loss ]]

使用Bash的正则匹配组BASH_REMATCH提取百分比数值


4、兼容性处理

macOS的Ping输出格式:

10 packets transmitted, 8 received, 20% packet loss

Linux的Ping输出格式:

10 packets transmitted, 8 received, 20% packet loss, time 9015ms



扩展功能建议

1、历史记录存储

添加日志记录,保存每次检测结果:

log_file="/var/log/network_health.log"
echo "$(date +%F_%T) $target 丢包率 ${loss_percent}%" >> $log_file


2、多目标批量检测

从文件读取IP列表检测:

while read ip; do
  ./check_packet_loss.sh $ip 5 10
done < ip_list.txt


3、可视化监控

生成丢包率趋势图(需安装gnuplot):

awk '{print $1, $5}' $log_file | gnuplot -p -e 'set xdata time; set timefmt "%Y-%m-%d_%H:%M:%S"; plot "-" using 1:2 with lines'



注意事项

1、权限要求

普通用户通常可直接运行Ping

若需写入系统日志(如/var/log),需sudo权限


2、防火墙影响

确保目标地址未屏蔽ICMP协议


3、定时任务集成

通过crontab每5分钟检测一次:

*/5 * * * * /path/to/check_packet_loss.sh 192.168.1.1 10 5

通过此脚本,您可以快速诊断网络稳定性,及时发现问题并触发告警,非常适合运维监控场景!


上一节:如何设置邮件通知?下一节: