【Flask开发实战】防火墙配置文件解析(二)之shell读取内容

一、前言

上一篇文章中,介绍了防火墙配置文件包含的基本元素和格式样式,并模拟了几组有代表性的规则内容,作为基础测试数据。在拿到基础测试数据后,关于我们最终想解析成的数据是什么样式的,其实不难看出,主要还是和IP地址组、服务端口组、规则清单这三个模块类别有关。配置文件里的数据内容是逐行从上到下,依次展示的IP地址组信息、服务端口组信息、规则清单信息;故我们可采用shell逐行读取文本内容,加上相应的过滤处理机制,分别获取到我们想要的三个模块完整信息。

二、shell处理说明

1、定义好工作处理目录,及相应参数文件,方便脚本处理时文件的统一输出和获取,例如:

#定义工作目录

dir="/mnt/hgfs/python/rule/test"

#定义工作临时目录

dirtmp="/mnt/hgfs/python/rule/test/dirtmp"

#定义防火墙配置文件目录
dirtcfg="/mnt/hgfs/python/rule/test/cfg"

#定义防火墙处理结果输出目录
dirresult="/mnt/hgfs/python/rule/test/result"

#定义防火墙名称
fwname="policy"

2、处理逻辑

通过整体配置文件的读循环,将每行内容输出到临时文件中,再对临时文件进行文本过滤,依次获取到 所有IP地址组信息、服务端口组信息、规则清单信息,在文本过滤过程中,需要考虑到不同文本的过滤条件,以及数量的控制(例如一个端口组下面对应多条端口信息等),示例如下:

1)定义好需要截取的数据内容和准备工作

###创建三类表的基础信息内容

echo 'fwname ipgroupname securityzone ipaddress' > $dirresult/$fwname-ipgroup
echo 'fwname servicegroupname serviceport' > $dirresult/$fwname-servicegroup
echo 'fwname rulename ruleid description action source-zone destination-zone source-ip-host destination-ip service' > $dirresult/$fwname-rule

####创建三类表临时处理目录及初始文件

mkdir -p $dirtmp/$fwname/ipgrouplinshitmp
mkdir -p $dirtmp/$fwname/servicegrouplinshitmp
mkdir -p $dirtmp/$fwname/rulelinshitmp

echo  "#" >  $dirtmp/$fwname/ipgrouplinshitmp/name
echo  "#" >  $dirtmp/$fwname/ipgrouplinshitmp/zone
echo  "#" >  $dirtmp/$fwname/ipgrouplinshitmp/ip
echo  "#" >  $dirtmp/$fwname/servicegrouplinshitmp/servicename
echo  "#" >  $dirtmp/$fwname/servicegrouplinshitmp/serviceport
echo  "#" >  $dirtmp/$fwname/rulelinshitmp/rule
echo  "#" >  $dirtmp/$fwname/rulelinshitmp/ruleid
echo  "#" >  $dirtmp/$fwname/rulelinshitmp/description
echo  "#" >  $dirtmp/$fwname/rulelinshitmp/action
echo  "#" >  $dirtmp/$fwname/rulelinshitmp/sourcezone
echo  "#" >  $dirtmp/$fwname/rulelinshitmp/destinationzone
echo  "#" >  $dirtmp/$fwname/rulelinshitmp/sourceip
echo  "#" >  $dirtmp/$fwname/rulelinshitmp/destinationiphost
echo  "#" >  $dirtmp/$fwname/rulelinshitmp/service

2)循环读取文本内容

####开始读取

cat $dirtcfg/$fwname > $dirtmp/datatmp
echo finalctrl >> $dirtmp/datatmp
cat $dirtmp/datatmp |while read i;
do
echo $i > $dirtmp/$fwname/linshi
 

####截取关键内容####

ipgroupname=`cat $dirtmp/$fwname/linshi|awk '{ $1="";$2=""; print $0}'`
ipaddress=`cat $dirtmp/$fwname/linshi|awk '{$1="";$2=""; print $0}'`
servicename=`cat $dirtmp/$fwname/linshi|awk '{print $3}'`
serviceport=`cat $dirtmp/$fwname/linshi|awk '{$1="";$2="";$3=""; print $0}'`
rulename=`cat $dirtmp/$fwname/linshi|awk '{ $1="";$2=""; print $0}'`
description=`cat $dirtmp/$fwname/linshi|awk '{ $1=""; print $0}'`
action=`cat $dirtmp/$fwname/linshi|awk '{ $1=""; print $0}'`
sourcezone=`cat $dirtmp/$fwname/linshi|awk '{ $1=""; print $0}'`
destinationzone=`cat $dirtmp/$fwname/linshi|awk '{ $1=""; print $0'}`
sourceip=`cat $dirtmp/$fwname/linshi|awk '{ $1=""; print $0}'`
destinationiphost=`cat $dirtmp/$fwname/linshi|awk '{ $1=""; print $0}'`
service=`cat $dirtmp/$fwname/linshi|grep service|awk '{ $1=""; print $0}'`

3)读取数量的控制,文本内容中,可能存在部分字段为空,同一字段多数值的情况出现,所以增加个数量统计,用以判断取值,例如(截取部分)

###记录各字段计数

ipgroupnum=`cat $dirtmp/$fwname/linshi|grep "ip address-set"|wc -l`
servicenamenum=`cat $dirtmp/$fwname/linshi|grep "ip service-set"|wc -l`
servicenum=`cat $dirtmp/$fwname/linshi|grep service|wc -l`
finalctl=`cat $dirtmp/$fwname/linshi|grep finalctrl|wc -l`

###if语句用来控制记录

if [ $ipgroupnum -eq 1 ];then
  name=`cat $dirtmp/$fwname/ipgrouplinshitmp/name`
  zone=`cat $dirtmp/$fwname/ipgrouplinshitmp/zone`
  ip=`cat $dirtmp/$fwname/ipgrouplinshitmp/ip`
  echo "$fwname $name $zone $ip"  >>$dirresult/$fwname-ipgroup
  rm -rf $dirtmp/$fwname/ipgrouplinshitmp
  mkdir $dirtmp/$fwname/ipgrouplinshitmp
  echo $ipgroupname> $dirtmp/$fwname/ipgrouplinshitmp/name
  echo  "#" >$dirtmp/$fwname/ipgrouplinshitmp/zone
  echo  -n "#" >  $dirtmp/$fwname/ipgrouplinshitmp/ip
  touch  $dirtmp/$fwname/ipgrouplinshitmp/ip
   
elif [ $securityzonenum -eq 1 ];then
  rm -rf $dirtmp/$fwname/ipgrouplinshitmp/zone
  echo   "$securityzone">> $dirtmp/$fwname/ipgrouplinshitmp/zone

三、结果展示

完整脚本执行完之后,可以获取到3个目标数据内容,处理后的格式以csv表格文件形式记录,如

地址组基础数据

端口组基础数据

规则基础数据

完成这一步,算是对原始数据的读取识别,输出成我们想要的基础数据格式(也就是3类数据基础表),下一步则是需要对这3类表进一步展开处理,例如三者之间的关联补充,丰富更多的字段信息等操作内容,处理完,再把最终的数据入库,用于后期的页面查询展示。 

关于这一块的数据处理,也有其他程序处理的手段,例如python、java、go语言,都有文本处理的方式,大家都习惯于用哪一种呢?

相关推荐

  1. Flask开发实战防火墙配置文件解析(一)

    2024-03-19 16:02:01       17 阅读
  2. Flask python 开发篇:配置文件

    2024-03-19 16:02:01       18 阅读
  3. firewall防火墙配置实战

    2024-03-19 16:02:01       29 阅读
  4. Golang实践录:读取ini配置文件

    2024-03-19 16:02:01       44 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-19 16:02:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-19 16:02:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-19 16:02:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-19 16:02:01       18 阅读

热门阅读

  1. C语言经典例题 --- 公因数、素数、闰年

    2024-03-19 16:02:01       18 阅读
  2. 零基础学python:8、 函数的基础

    2024-03-19 16:02:01       22 阅读
  3. Electron框架初识:原理与实践优势深度解读

    2024-03-19 16:02:01       13 阅读
  4. 2分钟速览!chatgpt的使用方法

    2024-03-19 16:02:01       16 阅读
  5. 创建存储过程,与存储过程调用

    2024-03-19 16:02:01       25 阅读
  6. linux命令学习之split 分割大文件 —— 筑梦之路

    2024-03-19 16:02:01       16 阅读
  7. 24计算机考研调剂 | 浙江科技大学

    2024-03-19 16:02:01       15 阅读
  8. 一文解读ISO26262安全标准:初步危害分析PHA

    2024-03-19 16:02:01       15 阅读