Panabit Shell脚本实现定时更新IP群组地址列表

  客户需求为:限制终端无法上网,但是能够使用企业微信,由于Panabit对企业微信协议识别不全,限制了上网后放行企业微信,有些功能无法正常使用,比如企业微信客户端聊天收发图片以及小文件功能(小于20M),无法识别到。根据企业微信的帮助手册中公开的企业微信域名IP列表。定制规则,针对表里的IP进行地址放行。由于官方数据存在更新,因此需要写一个可以定期更新的脚本实现客户需求。

该脚本是一个 Bash 脚本,设计用于执行一系列网络测试和数据处理任务,具体功能如下:

  1. 变量定义:脚本开始部分定义了一些变量,包括用于存储JSON数据的文件名(json_file),设定的定时执行时间(timing_exec),需要访问的HTTP URL(http_url),一个包含测试项目(jsonpingcurl)的字符串(testing_project),以及用于存储IP地址的文件路径(IP)。
  2. 测试任务函数(testing_task:此函数根据传入的参数($1),执行三种不同的测试:
  • json:检查系统是否安装了jq工具,这是处理JSON数据的工具。
  • ping:使用ping命令测试与外部地址(223.5.5.5)的网络连通性。
  • curl:使用curl命令测试对指定HTTP URL的HTTP请求是否成功,并检查响应状态码是否为200、301或302。
  1. 测试执行函数(testing_exec:此函数遍历testing_project中定义的测试项目,调用testing_task函数执行它们,并将结果记录到日志文件(run.log)中。成功完成所有测试时,successes变量会递增。
  2. 筛选IP函数(screening:此函数使用wget下载指定URL的JSON文件,然后使用jq解析该JSON文件,提取特定部分(Section4)的IP地址列表,并将其写入到IP文件中。
  3. 主运行函数(run_main:此函数构成脚本的主要执行循环。它无限期地运行,每小时检查一次当前时间是否与预设的执行时间(timing_exec)相匹配。如果是,则执行测试和筛选IP的函数,并在所有测试成功后调用floweye命令(这似乎是一个自定义或第三方工具)来加载IP地址文件。
  4. 日志记录:脚本在执行过程中,会将运行的时间、测试结果等信息记录到日志文件中,便于跟踪和调试。
  5. 定时执行:脚本通过sleep 3600命令在每次循环后休眠一小时,以实现定时执行的功能。
  6. 退出策略:在testing_exec函数中,如果在执行测试时遇到错误,脚本会记录错误并退出。

  这个脚本的作用是定期验证网络连接和工具的可用性,下载和解析特定的JSON数据,并在满足条件时执行一些自定义操作(如加载IP地址到floweye)。它适用于需要定期检查网络状态和自动化数据处理任务的场景。

#!/bin/bash

# 定义变量
json_file='latest.json'          # JSON文件名
timing_exec='24'                 # 定时执行的小时数(24小时制)
http_url='https://res.mail.qq.com/zh_CN/wework_ip/latest.json'  # HTTP URL
testing_project='json ping curl'  # 测试项目列表
IP="$(pwd)/ipaddress.txt"       # IP地址文件路径

# 定义测试任务函数
function testing_task() {
    case "$1" in 
        json)
            # 检查jq工具是否存在
            if command -v jq > /dev/null; then
                return 0
            else
                return 127
            fi
        ;;
        ping)
            # 执行ping测试
            if ping -c 4 223.5.5.5 > /dev/null; then
                return 0
            else
                return 126
            fi
        ;;
        curl)
            # 执行curl HTTP请求测试
            if curl -o /dev/null -s -w "%{http_code}" -k "$http_url" | grep -qE "200|301|302"; then
                return 0
            else
                return 125
            fi
        ;;
        *)
            return 255
        ;;
    esac
}

# 定义测试执行函数
function testing_exec() {
    successes=0  # 初始化成功测试计数器
    echo "Running time $(date '+%Y-%m-%d %H:%M:%S')" >> "$(pwd)/run.log"  # 记录运行开始时间
    
    for i in $testing_project; do
        testing_task "$i"  # 执行测试任务
        status=$?  # 获取测试状态码
        
        if [ "$status" -eq 0 ]; then
            # 如果测试成功,记录到日志
            case "$i" in
                json)
                    echo 'JSON test is successful' >> "$(pwd)/run.log"
                    ((successes++))
                    ;;
                ping)
                    echo 'Ping is successful' >> "$(pwd)/run.log"
                    ((successes++))
                    ;;
                curl)
                    echo 'HTTP request successful' >> "$(pwd)/run.log"
                    ((successes++))
                    ;;
            esac
        else
            # 如果测试失败,记录错误到日志并退出
            case "$status" in
                127)
                    echo "Error: jq is not installed or not in the PATH" >> "$(pwd)/run.log"
                    ;;
                126)
                    echo "Error: Ping failed" >> "$(pwd)/run.log"
                    ;;
                125)
                    echo "Error: HTTP request failed" >> "$(pwd)/run.log"
                    ;;
                *)
                    echo "An unknown error occurred with status $status" >> "$(pwd)/run.log"
                    exit 255
                    ;;
            esac
        fi
    done
}

# 定义筛选IP的函数
function screening() {
    # 使用wget下载JSON文件
    wget -O "$json_file" --no-check-certificate "$http_url"
    # 解析JSON文件并提取IP地址
    jq '.[] | select(.Section == "Section4") | .IPList' $json_file | grep -Eo '((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])' > "$IP"
}

# 定义主运行函数
function run_main() {
    while true; do
        # 检查是否到达设定的执行时间
        if [ "$(date +%H)" -eq "$timing_exec" ]; then
            testing_exec  # 执行测试
            screening     # 执行IP筛选
            # 如果所有测试成功,则执行floweye命令
            if [ "$successes" -eq 3 ]; then
                floweye table loadfile tid=1 file="$IP" clear=1 # tid为IP群组ID号,需要先创建IP群组。
            fi
        fi
        sleep 3600  # 休眠一小时
    done
}

# 运行主函数
run_main
Panabit Shell脚本实现定时更新IP群组地址列表

脚本写好后,还需要针对IP群组写对应的流控规则,放行IP群组。

Panabit Shell脚本实现定时更新IP群组地址列表

至此,需求环境部署就实现了。

原理:

Panabit Shell脚本实现定时更新IP群组地址列表

Wework_IP_List工具功能:

  • 添加了对curl下载失败的检查
  • 添加了对jq.exe是否存在的检查
  • 添加了jq查询语法,确保提取所有网络类型(cnet/mobile/other/cnc)的IP地址
  • 清空输出文件避免重复追加
  • 添加了更详细的执行状态反馈

以下是curl和jq工具在不同操作系统下的安装方法:

一、curl安装方法‌

Windows系统‌

下载curl二进制文件:访问官网(https://curl.se/windows/)下载对应版本
解压后配置环境变量:将curl.exe所在目录添加到PATH环境变量
验证安装:在cmd执行curl –version查看版本信息

Linux系统‌

Debian/Ubuntu:sudo apt update && sudo apt install curl
RHEL/CentOS:sudo yum install curl
验证安装:执行curl -V检查是否安装成功

macOS系统‌

使用Homebrew安装:brew install curl

二、jq安装方法‌

Windows系统‌

下载二进制文件:从GitHub(https://github.com/jqlang/jq)下载jq-windows.exe
重命名为jq.exe并放入系统PATH目录
验证安装:执行jq –version

Linux系统‌

Debian/Ubuntu:sudo apt install jq
RHEL/CentOS:sudo yum install epel-release && sudo yum install jq
离线安装:下载二进制文件后赋予执行权限chmod +x jq

macOS系统‌

使用Homebrew安装:brew install jq
验证安装:echo ‘{“test”:1}’ | jq查看输出

三、常见问题处理‌

若提示命令未找到,检查PATH环境变量配置
权限问题可尝试使用sudo或切换root用户
网络问题可尝试更换下载源或手动下载安装包

安装完成后,可通过curl -s URL | jq组合命令测试工具是否正常工作。

Wework_IP_List

白金会员白金会员¥0.35
黄金会员黄金会员¥0.11
钻石会员钻石会员免费
版本 1.0 大小 712kb 来源 Mr.xu 博客网 作者 网络民工 平台 WinAll 价格 ¥1.00 发行 2025年9月3日 更新 2025年9月3日 销售数量 0
已付费?登录刷新

历史上的今天

2014年:月到中秋分外明,每逢佳节倍思亲。(0条评论)

2014年:8张火车票,带你走遍最美中国!(0条评论)

请博主喝杯咖啡呢,谢谢^_^

如果本文“对您或有帮助”,欢迎随意打赏,以资鼓励继续创作!

原创文章《Panabit Shell脚本实现定时更新IP群组地址列表》,作者:笔者 徐哲钻石会员,未经允许不得转载。
转载或复制时,请注明出处:https://www.xuxiaokun.com/3431.html,本文由 Mr.xu 博客网 整理。
本站资源下载仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

(0)
打赏 微信扫一扫赞赏 微信扫一扫赞赏 支付宝扫一扫赞赏 支付宝扫一扫赞赏
上一篇 2025年5月8日 14:36
下一篇 2020年5月19日 22:42

发表回复

登录后才能评论

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理

笔者期待与您共勉 · 互赢

有言必答、商务合作、有偿服务

QQ:点击这里给我发消息

邮件:it@xuxiaokun.com

线上沟通时间 ↓↓↓:

周一至周五 9:30 - 17:30

其余时间Mail或QQ我,有言必应。

244439232