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.0/16 dev 网口名称,打印ping失败。延迟200毫秒后继续循环。

回答:

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

#!/bin/bash

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

# 无限循环
while true; do
    # 进行ping操作
    ping -c $PING_COUNT -i $PING_INTERVAL 192.168.3.1 > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        # 检查丢包率
        LOSS_COUNT=$(ping -c $PING_COUNT -i $PING_INTERVAL 192.168.3.1 | grep -oP '\d+(?=% packet loss)')
        if [ $LOSS_COUNT -ge $LOSS_THRESHOLD ]; then
            # 检查路由表
            route -n | grep -q "169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 $INTERFACE_NAME"
            if [ $? -ne 0 ]; then
                # 添加路由
                route add -net 169.254.0.0/16 dev $INTERFACE_NAME
            fi
            # 打印ping失败
            echo "Ping failed"
        fi
    fi
    # 延迟200毫秒
    sleep 0.2
done

这个脚本会每3秒ping一次192.168.3.1,连续ping3次。如果ping不通且丢包率达到或超过2次,则检查路由表中是否存在指定的路由。如果不存在,则添加该路由并打印"Ping failed"。然后延迟200毫秒后继续循环。

请确保你有足够的权限来执行route add命令,通常需要root权限。你可以使用sudo来运行这个脚本:

sudo ./your_script_name.sh

your_script_name.sh替换为你保存脚本的文件名。