暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

bat批量提取所有域名和ip(附源码)

大米谭 2021-03-13
1379


if喜欢

点个赞吧!




背景


大型商业银行的开发经常要承担大量的运维工作。比如机器扩节点要开防火墙。

由于没有OPCM类的管理系统,运行经常要项目组的研发帮忙整理excel。

作为互联网调用有太多的策略要开,前人也没有留有详细的台账。

即使留了台账,中间穿插的需求的策略也特别容易遗漏。

肉眼的比对也不现实不合理。

之前用jquery写了个snippet捕捉某个项目下的所有ip和域名。

(如有需要,欢迎留言)

运维担心run了插件会对配置中心造成不好影响。

在此背景下,研发了bat批量捞取域名和ip的脚本。

欢迎大家提BUG,不定更新。






思路





首先确认要做的事情:


0.开始。

1.循环遍历文件夹和子文件夹并捞出所有配置文件的value值;

2.查找常见协议所在的行,如http,tcp等;

3.正则查找ip;

4.特殊字符替换成指定分隔符,如:空格,括号,双引号等;

5.开始输出域名并写到csv文件;

6.开始输出ip并写到csv文件;

7.删除临时变量txt;

8.结束。


下面欢迎大家指教源码。









findIplist.bat

@echo off&SetLocal EnableDelayedExpansion

echo.
echo.
echo ==============================================================
echo 作者:大米
echo 时间:20210312
echo 请阅读【readme.md】
echo 循环较多,预计需要5分钟,请耐心等待
echo ==============================================================
echo.

set baseLocation=%~dp0

echo ==============================================================
echo 1.开始进行ip域名等查找
echo ==============================================================
echo.

for /R %cd% %%f in (*.properties) do (
for /f "tokens=1,2* delims==" %%i in (%%f) do (
set str=@
echo %%~nf!str!%%j@ >>%~dp0/a.txt
)
)

findstr "http" a.txt >>b.txt
findstr "tcp" a.txt >>b.txt
findstr "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" a.txt >>b.txt

echo ==============================================================
echo 2.替换不必要的协议及上下文接口为@
echo ==============================================================
echo.

for /f "delims=" %%k in (b.txt) do (
set afterline1=%%k
set afterline1=!afterline1:https://=@!
set afterline1=!afterline1:http://=@!
set afterline1=!afterline1:/=@!
set afterline1=!afterline1:,=@!
set afterline1=!afterline1:#=@!
set afterline1=!afterline1: =@!
set afterline1=!afterline1:^)=@!
set afterline1=!afterline1:^"=@!
echo !afterline1! >>c.txt
)

findstr "@*.com@" c.txt >> d1.txt
findstr "@*.com:" c.txt >> d1.txt
findstr "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" c.txt >>d2.txt

echo ==============================================================
echo 3.开始输出域名,请勿中断,如中断,请删除文件夹下的csv再重新执行
echo ==============================================================
echo.

for /f "tokens=1,2* delims=@" %%i in (d1.txt) do (
set myi = %%i
echo %%i,%%j  >> ipList.csv
)

echo ==============================================================
echo 4.开始输出ip,请勿终端,如中断,请删除文件夹下的csv再重新执行
echo ==============================================================
echo.

set "small= abcdefghijklmnopqrstuvwxyz"
set "big= ABCDEFGHIJKLMNOPQRSTUVWXYZ"

rem 输出字母变量
for /l %%a in (1 1 26) do (
echo !small:~%%a,1!>>alf.txt
echo !big:~%%a,1!>>alf.txt
)

for /f "tokens=1* delims=@" %%k in (d2.txt) do (
set TESTLIST=%%l
set TMPLIST=!TESTLIST!
call str.bat !TMPLIST! d3.txt
)

findstr "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" d3.txt >>d4.txt

for /f "tokens=1,2* delims=," %%i in (d4.txt) do (
set myi = %%i
echo %%i,%%j  >> ipList.csv
)

echo ==============================================================
echo 5.删除临时文件
echo ==============================================================
echo.

rem *.txt

echo ==============================================================
echo 6.恭喜您!执行成功!可关闭窗口退出
echo ==============================================================
echo.

pause


str.bat

@echo off&setlocal enabledelayedexpansion

set TMPLIST=%1
set filename=%2
set /a NUM = 1
:loop
for /f "tokens=1* delims=@" %%a in ("!TMPLIST!") do (
  echo %%k,%%a>>!filename!
  set /a NUM = NUM + 1  
  set TMPLIST=%%b
)
if defined TMPLIST goto :loop






详解



01 - 循环遍历文件夹和子文件夹并捞出所有配置文件的value值


第一个循环的目的是读取当前目录下的所有的properties文件,并且将文件名赋值给%%f。


第二个循环的目的是遍历第一个循环找到的文件,按@分隔后,逐行输出value的值。因为配置中心一般以key,value形式存储,key值我们暂时不需要。


for /R %cd% %%f in (*.properties) do ( 
for /f "tokens=1,2* delims==" %%i in (%%f) do (
set str=@
echo %%~nf!str!%%j@ >>%~dp0/a.txt
)
)


有关for的用法,大家可以在cmd中,输入help for。


token和delims非常常用。delims表示分隔,这里是按等号分隔。而token表示列,这里表示从第一列开始算,总共分成两列。变量为%%i,%%j。


假设有以下数据:


1=2=3=4


那么%%i=1,%%j=2=3=4


我们要的是value值,所以我们取%%j即可。但同时我们需要文件名进行映射,所以我们需要输出%%~nf,表示文件名。


如此以来,我们得到我们的第一个变量文件a.txt,每行的格式是:


文件名@value值


findstr 可以查找并输出所在行,我们排除其他的非ip和域名变量,输出到指定我们的第二个临时变量文件b.txt。


由此,初步的数据清洗已经完成。



02 - 查找常见协议所在的行


步骤01初步清洗了后,由于域名和ip的格式基本固定,为了后续同行拆分方便,将前后无用的一些格式直接替换为我们的分隔符@,便于后续findstr去进行查找。


需要特别注意的是,有些符号需要shift+6进行转义气。如)"


此时输出的临时文件为c.txt


set afterline1=!afterline1:^)=@!
set afterline1=!afterline1:^"=@!




03 - 正则查找ip


关键如标题,注意正则表达式的写法即可。


此时输出的文件为【域名:d1.txt】,【ip为:d2.txt】


findstr "@*.com@" c.txt >> d1.txt
findstr "@*.com:" c.txt >> d1.txt
findstr "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*" c.txt >>d2.txt



04- 开始输出域名和ip


读取输出的过程大同小异,需要特别注意的是,由于会出现多个ip以逗号或者井号或者其他特殊符号分隔放在一行的情况,详见各种配置文件中集群的配置,如redis,kafka,mq等。因此特别需要注意对每行都需先拆ip分成多行,这样findstr好找。


如:


【文件名A】,192.168.0.1@192.168.0.2@192.168.0.3


变成:


【文件名A】,192.168.0.1

【文件名A】,192.168.0.2

【文件名A】,192.168.0.3


另外由于goto :loop会跳出所有循环,因此在两个for循环的情况下,建议用call。但是call表示的是执行某个脚本,因此要单独做个逐行输出的脚本,否则call的时候会执行到当前脚本的最后一行。和我们在当前for下循环的初衷背离了。


for /f "tokens=1* delims=@" %%k in (d2.txt) do (
set TESTLIST=%%l
set TMPLIST=!TESTLIST!
call str.bat !TMPLIST! d3.txt
)


str.bat行转列bat如下:

set TMPLIST=%1
set filename=%2
set /a NUM = 1
:loop
for /f "tokens=1* delims=@" %%a in ("!TMPLIST!") do (
  echo %%k,%%a>>!filename!
  set /a NUM = NUM + 1  
  set TMPLIST=%%b
)
if defined TMPLIST goto :loop


%1 %2表示的是传入变量,这里指的是每行的值以及输出的临时文件的名称。

!TMPLIST!表示行,假设TMPLIST= 今天@天气@很好

那么变量%%a=今天,%%b=天气@很好,并将%%b作为新行,继续循环,直到行为空。找不到行了,则跳出循环。




05 - 删除临时文件


将txt相关的文件删除,由此大功告成。



小结



工欲善其事,必先利其器。

老祖宗传承下来的精华格言还是非常美妙的。

愿我能坚持,至少一月更一篇技术贴或者其他心得!加油!






                 

| 闲谈FGC | 大大与吉吉 | Honk! | 

| 2-3岁男孩玩具推荐 | Arnold |

| 0-2岁绘本系列推荐 | 0-2岁玩具推荐 

|《大大的挖土机》 |却道寻常是无常

| 文科高考数学和弦题详解 | 妖怪的宫殿前传 

妖怪的宫殿 | HEAVY RAIN | HYMN TO BIRTH 

没了的灵感 | 夜月 | PILIPIA FIRE专栏 | 月光牧童 

pilipia fire-pat3-间奏 | 20111001钢琴曲 | 赞歌 

ChinaTown | 变调421 | ICE | 20121216钢琴曲 

古老的传说 | 老奶奶的故事 | 莫扎特咏叹调1号 

the music 's always with you 

CIAO BELLA(piano) | 化作千风 

learn to be lonely | the lord bless u and keep u 

暴风雨前夕的菜花田 | 海洋 | 两幅图 | 学画画的大米 

大米说  | 贾后夺权计杀王族 ,八王夺位自相残杀 

永嘉之乱西晋之亡,衣冠南渡东晋而立 |





    


 

喜欢就关注我吧!


3月 踏春好季节



文章转载自大米谭,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论