客户需求为:限制终端无法上网,但是能够使用企业微信,由于Panabit对企业微信协议识别不全,限制了上网后放行企业微信,有些功能无法正常使用,比如企业微信客户端聊天收发图片以及小文件功能(小于20M),无法识别到。根据企业微信的帮助手册中公开的企业微信域名IP列表。定制规则,针对表里的IP进行地址放行。由于官方数据存在更新,因此需要写一个可以定期更新的脚本实现客户需求。
该脚本是一个 Bash 脚本,设计用于执行一系列网络测试和数据处理任务,具体功能如下:
- 变量定义:脚本开始部分定义了一些变量,包括用于存储JSON数据的文件名(
json_file
),设定的定时执行时间(timing_exec
),需要访问的HTTP URL(http_url
),一个包含测试项目(json
、ping
、curl
)的字符串(testing_project
),以及用于存储IP地址的文件路径(IP
)。 - 测试任务函数(
testing_task
):此函数根据传入的参数($1
),执行三种不同的测试:
json
:检查系统是否安装了jq
工具,这是处理JSON数据的工具。ping
:使用ping
命令测试与外部地址(223.5.5.5)的网络连通性。curl
:使用curl
命令测试对指定HTTP URL的HTTP请求是否成功,并检查响应状态码是否为200、301或302。
- 测试执行函数(
testing_exec
):此函数遍历testing_project
中定义的测试项目,调用testing_task
函数执行它们,并将结果记录到日志文件(run.log
)中。成功完成所有测试时,successes
变量会递增。 - 筛选IP函数(
screening
):此函数使用wget
下载指定URL的JSON文件,然后使用jq
解析该JSON文件,提取特定部分(Section4)的IP地址列表,并将其写入到IP
文件中。 - 主运行函数(
run_main
):此函数构成脚本的主要执行循环。它无限期地运行,每小时检查一次当前时间是否与预设的执行时间(timing_exec
)相匹配。如果是,则执行测试和筛选IP的函数,并在所有测试成功后调用floweye
命令(这似乎是一个自定义或第三方工具)来加载IP地址文件。 - 日志记录:脚本在执行过程中,会将运行的时间、测试结果等信息记录到日志文件中,便于跟踪和调试。
- 定时执行:脚本通过
sleep 3600
命令在每次循环后休眠一小时,以实现定时执行的功能。 - 退出策略:在
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

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

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

Wework_IP_List工具功能:
- 添加了对curl下载失败的检查
- 添加了对jq.exe是否存在的检查
- 添加了jq查询语法,确保提取所有网络类型(cnet/mobile/other/cnc)的IP地址
- 清空输出文件避免重复追加
- 添加了更详细的执行状态反馈
使用方法:
需要先安装curl和jq工具
确保jq.exe在系统PATH路径或在脚本所在目录
最终结果会保存在脚本所在目录的Ip_list.txt文件中
以上部署若难度较大,整不了,可以通过以下笔者为Windows下通过Bash方式运行手动获取企微图片官方解析地址解决方案。
以下是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组合命令测试工具是否正常工作。
关键处理文件,请下载下面附件至桌面,部署环境后运行即可。
历史上的今天
2014年:月到中秋分外明,每逢佳节倍思亲。(0条评论)
2014年:8张火车票,带你走遍最美中国!(0条评论)
请博主喝杯咖啡呢,谢谢^_^
如果本文“对您或有帮助”,欢迎随意打赏,以资鼓励继续创作!
原创文章《Panabit Shell脚本实现定时更新IP群组地址列表》,作者:笔者 徐哲,未经允许不得转载。
转载或复制时,请注明出处:https://www.xuxiaokun.com/3431.html,本文由 Mr.xu 博客网 整理。
本站资源下载仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。