[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[系统相关] [已解决]批处理怎样重定向windump的输出到for命令?

小弟初学批处理,遇到一个问题,劳烦各位解答:
小弟是想要把windump(一个命令行抓包工具)的输出用for循环来处理,提取出一些ip信息,可是却无法成功提取,具体现象如下:

(1)代码如下:
  1. @echo off
  2. for /f "tokens=2 delims= " %%i in ('windump') do @echo %%i
  3. pause
复制代码
输出结果是:
D:\Intrepid\TEST>test.bat
windump: listening on \Device\NPF_{3B512CD8-BFE8-44BD-B692-8574570905E0}
_(光标闪呀闪,闪个不停,但就是没输出了)

(2)代码如下:
  1. @echo off
  2. for /f "tokens=4 delims= " %%i in ('windump 1^<^&2') do @echo %%i
  3. pause
复制代码
(1<&2意思是把2的指向复制给1的指向,在一篇文上看的,其实我也不怎么懂....)
输出结果是:
D:\Intrepid\TEST>test.bat
windump: listening on \Device\NPF_{3B512CD8-BFE8-44BD-B692-8574570905E0}
20:05:52.255592 arp who-has 192.168.1.1 tell Intrepid
20:05:52.256139 arp reply 192.168.1.1 is-at 00:14:78:6b:99:50 (oui Unknown)
20:05:52.256202 IP Intrepid > 192.168.1.1: ICMP echo request, id 1, seq 5, length 40
(输出一点没变化,即就跟没经过for循环一样!)

问题就是:想把windump的输出经过for循环提取一些有用的输出,要怎么实现?或者给我推荐个好用的命令行抓包工具也行呀!
小弟在此谢谢了呀!!!!

[ 本帖最后由 bluefoxe 于 2010-12-23 15:27 编辑 ]
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

是因为 for 是一次性收集数据,然后再处理。所以 for 一直在等待 windump.exe 进程结束。如果你把进程 windump.exe 结束了,你的代码(1)就能看到结果。

TOP

在代码1里:对windump使用echo exit|,即'echo exit^|windump'
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

哦,我明白了,我在linux上用命令 sudo tcpdump -nt arp | gawk '{ print $6 }' 也是这样子,应该也是这个原因,那具体要怎么解决呀?
小弟比较愚笨,楼上的请明示呀,具体代码贴上来最好了,^_^

TOP

不等一个进程结束,就获取它的输出,有没有什么办法呀?或者设定让它运行几秒退出再运行?有没有其他办法呀?

TOP

-c
Exit after receiving count packets.

用这个参数可以退出 windump.exe。可以做一个循环:
  1. @echo off
  2. :Loop
  3. for /f "tokens=2 delims= " %%i in ('windump -c 10') do echo %%i
  4. goto Loop
复制代码

[ 本帖最后由 tmplinshi 于 2010-12-22 23:51 编辑 ]

TOP

  1. @echo off
  2. :Begin
  3. SetLocal
  4. set WinDump.log_LastSize=0
  5. start /b WinDump.exe >WinDump.log
  6. :Loop
  7. :: 设置循环分析 WinDump.log 的间隔时间。单位是秒,请修改 -n 后面的数字。
  8. >nul Ping 127.1 -n 5
  9. :: 检测 WinDump.log 的大小来判断是否抓到了新数据,没有新数据就继续等待。
  10. for %%a in (WinDump.log) do (
  11.     if %%~za equ %WinDump.log_LastSize% goto Loop
  12.     set WinDump.log_LastSize=%%~za
  13. )
  14. :: 用 for 直接读取 WinDump.log,会提示找不到文件。。所以改用“type WinDump.log”。
  15. for /f "%skip% tokens=2" %%a in ('type WinDump.log') do (
  16.     rem 下面这句不要删了,是用于计算下一次分析 WinDump.log 要略过的行数。
  17.     set /a Skip_Num += 1
  18.     echo %%a
  19. )
  20. :: WinDump.log 文件会不断增大,文件过大处理起来会比较吃力的吧。
  21. :: 而且由于在计算 Skip_Num,而批处理能计算的最大数是 2147483647,再加 1 就等于 -2147483648 了。
  22. :: 所以,最好设定一个行数,当大于这个行数时重启 WinDump.exe 并清空 WinDump.log。
  23. if %Skip_Num% gtr 100000 goto Restart
  24. set skip=skip=%Skip_Num%
  25. goto Loop
  26. :Restart
  27. EndLocal
  28. taskkill /f /im WinDump.exe
  29. goto Begin
复制代码
1

评分人数

TOP

呵呵,谢谢tmplinshi的热心帮助,上面的代码功能真是太齐全了!学到很多东西呀!^_^
在tmplinshi的帮助下,我自己的代码也出来了,呵呵,也贴出来下!
学校宿舍晚上会断电的,我写这个代码的初衷是想,在第二天早上来电的时候,自动开启电脑(我主板支持来电唤醒功能)并开启迅雷下载(哈哈!这是最终目的啦!),但是当检测到宿舍有其他人电脑开起来的时候,为不影响他上网(总共2m网速,没办法!),则必须马上关机!结合一台电脑开机的时候会广播arp包检测自己的IP在局域网上是否有冲突,以下代码就产生了,嘿嘿.....
  1. @echo off
  2. :Loop
  3. for /f "tokens=6 delims= " %%i in ('windump -n -c 1 arp') do (
  4.     echo %%i
  5.     if not %%i==192.168.1.1 (
  6.     :: 路由器IP地址,此时继续检测
  7.         if not %%i==192.168.1.255 (
  8.          ::广播地址,继续检测
  9.             if not %%i==192.168.1.110 (
  10.             ::本机IP,继续检测
  11.                 if not %%i==tell (
  12.                  ::查日志发现,有些arp包解析的第6个字段是个"tell",继续检测
  13.                     shutdown -s -t 30   
  14.                        ::过滤掉上面的值后剩下的就是局域网的其他主机的ip地址了,30秒关机!!
  15.                     echo Find it!!!!
  16.                     echo %%i >> ip.txt
  17.                     ::上面两句都不是必须的;
  18.                 ) else goto Loop
  19.             ) else goto Loop
  20.         ) else goto Loop
  21.     ) else goto Loop
  22. )
复制代码
呵呵!小弟很少玩批处理,linux shell倒是玩的多一些,上面代码肯定还会有些不足,希望大家多多建议呀,^_^

另外,发现windum还有个参数"-l 使标准输出变为缓冲行形式",这个参数在linux shell下面很好用,可以不用中断windump的运行,而直接把它的抓包分析结果传送给其他命令,例如
  1. tcpdump -ln arp | gawk '{ print $6 }'
复制代码
这样就很容易的得到了第六个字段,但是在windows上,却不可以用,挺奇怪的?只能采取了tmplinshi的方案!


[ 本帖最后由 bluefoxe 于 2010-12-23 17:08 编辑 ]

TOP

呵呵,其实不用关机也行,只要用taskkill /F /IM thunder.exe替换掉shutdown那行,把迅雷进程给关掉就可以了!

哈哈,测试通过了!当宿舍一台电脑启动到桌面的时候,我这台自动把迅雷关掉,并跳出一个框,提示一分钟后将关机!

TOP

返回列表