Bash脚本:每3秒ping一次并检查丢包率及路由设置

ChatGPT4o 使用 ChatGPT 4o 回答

问题:

使用bash写一个脚本,设置4个变量ping间隔、连续ping次数、丢包率、网口名称,每3秒ping一次192.168.3.1,连续ping3次,如果ping不通丢包2次及以上,则通过指令route -n检查是否有169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 wlan0这一行,如果没有则发送指令 route add -net 169.254.0.1 dev 网口名称,打印ping失败。延迟200毫秒后继续循环。

回答:

以下是一个符合你要求的Bash脚本:

#!/bin/bash

# 设置变量
PING_INTERVAL=3
PING_COUNT=3
LOSS_THRESHOLD=2
INTERFACE_NAME="wlan0"

# 目标IP地址
TARGET_IP="192.168.3.1"

while true; do
    # 执行ping命令并统计丢包数
    PING_RESULT=$(ping -c $PING_COUNT -i $PING_INTERVAL $TARGET_IP)
    PACKET_LOSS=$(echo "$PING_RESULT" | grep -oP '\d+(?=% packet loss)')

    # 检查丢包率是否超过阈值
    if [ "$PACKET_LOSS" -ge "$LOSS_THRESHOLD" ]; then
        # 检查路由表中是否���指定的路由
        ROUTE_CHECK=$(route -n | grep -E "169.254.0.0\s+0.0.0.0\s+255.255.0.0\s+U\s+0\s+0\s+0\s+$INTERFACE_NAME")

        if [ -z "$ROUTE_CHECK" ]; then
            # 添加指定的路由
            sudo route add -net 169.254.0.1 dev $INTERFACE_NAME
        fi

        # 打印ping失败信息
        echo "Ping failed. Packet loss: $PACKET_LOSS%"
    fi

    # 延迟200毫秒
    sleep 0.2
done

说明:

  1. 变量设置

    • PING_INTERVAL:ping的间隔时间,单位为秒。
    • PING_COUNT:连续ping的次数。
    • LOSS_THRESHOLD:丢包率阈值,超过该值则认为ping失败。
    • INTERFACE_NAME:网口名称。
  2. ping命令

    • ping -c $PING_COUNT -i $PING_INTERVAL $TARGET_IP:每隔$PING_INTERVAL秒ping一次目标IP地址,共ping $PING_COUNT次。
  3. 丢包率检查

    • 使用grepecho提取ping结果中的丢包率。
  4. 路由检查和添加

    • 使用route -n命令检查是否存在指定的路由。
    • 如果不存在,则使用sudo route add -net 169.254.0.1 dev $INTERFACE_NAME添加路由。
  5. 延迟

    • 使用sleep 0.2命令延迟200毫秒。

注意事项:

  • 该脚本需要root权限来添加路由,因此在执行时可能需要使用sudo
  • 确保你的系统中已安装pingroute命令。
  • 根据实际情况调整变量值和网口名称。