Board logo

标题: 高手这么多,谁写一个扫描本网内IP和mac! [打印本页]

作者: ygzxw     时间: 2006-12-29 04:54    标题: 高手这么多,谁写一个扫描本网内IP和mac!

要求:
能够扫描本网内(局域网内)在线所有IP及MAC,并输出保存一个*.txt文件!!!

高手请出手!!!!

[ Last edited by ygzxw on 2006-12-28 at 04:05 PM ]
作者: lxmxn     时间: 2006-12-29 04:56

  本网??什么是本网?内网么?

作者: mackyliu     时间: 2006-12-29 05:00
软件都做不到,别说批处理了.局域网内用户要是根本没打开server服务,看你怎么弄
作者: lxmxn     时间: 2006-12-29 05:03


  Quote:
Originally posted by mackyliu at 2006-12-28 16:00:
软件都做不到,别说批处理了.局域网内用户要是根本没打开server服务,看你怎么弄


  批处理怎么不行了?

作者: ygzxw     时间: 2006-12-29 05:04
软件可以做到的!!好多网管软件都可以的!!(本网就是局域网内)

我想应该有高人能做到,这里的DOS高手好多!~!
作者: lxmxn     时间: 2006-12-29 05:06

  Re ygzxw:

  把你在内网的net view命令的结果发来看看。我这里没有测试环境,不好写代码,所以只有参考你的了。

作者: ygzxw     时间: 2006-12-29 05:12
这儿不让传图!!!发不了
作者: lxmxn     时间: 2006-12-29 05:14

  发文本就行了。net view >>netview.txt,你把netview.txt的内容发过来。

作者: ygzxw     时间: 2006-12-29 05:17
高手就是多啊,又学一招,“net view >>netview.txt”扫描结果可以保存为一个文本!!
服务器名称            注释

-------------------------------------------------------------------------------
\\08A1A02668004B2                                                              
\\0B42C419F66F492                                                              
\\128217E5E2B843D                                                              
\\368138ECD3E8477                                                              
\\47F1FAEB1E114E7                                                              
\\5AC9C022019944A                                                              
\\77E1E3EB259D438                                                              
\\7F51BF1C1C044CE                                                              
\\A3119055661144B                                                              
\\ADMIN                                                                        
\\B021CA4B672C4DE                                                              
\\BEE9AFE136394E9                                                              
\\YGZX-JIN                                                                     
\\YGZX027                                                                     
\\YGZX060              zjc                                                     
\\YGZX09                                                                       
\\YGZX12                                                                       
\\YGZX22                                                                       
\\YGZX226                                                                     
\\YGZX24                                                                       
\\YGZX25                                                                       
\\YGZX27                                                                       
\\YGZX28                                                                       
\\YGZX32                                                                       
\\YGZX35                                                                       
\\YGZX62                                                                       
\\YGZX7                wjs007                                                  
\\YGZX95               ygzx95                                                  
\\YGZXCC36                                                                     
\\YGZX110  
命令成功完成。

[ Last edited by ygzxw on 2006-12-28 at 04:21 PM ]
作者: lxmxn     时间: 2006-12-29 05:18

  先试试这个,看行不?
@echo off
for /l %%a in (1,1,254) do (
        echo.&echo/&echo===================================>>list.txt
        for /f "delims== tokens=2" %%i in ('nbtstat -a 192.168.1.%%a^|find "MAC Address"') do echo %%i------------192.168.1.%%a >>list.txt
)
pause
notepad.exe list.txt
goto :eof

作者: ygzxw     时间: 2006-12-29 05:24
正在测试!!!!!!!!!

测试完毕!(不成功)本内网IP:192.168.0.1---192.168.0.254

保存文件中内容:
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================

[ Last edited by ygzxw on 2006-12-28 at 04:31 PM ]
作者: lxmxn     时间: 2006-12-29 05:30

  内网IP是什么打头的?不是192.168.1.……之类的么?

作者: lxmxn     时间: 2006-12-29 05:32

  再试试:
@echo off
for /l %%a in (1,1,254) do (
        echo.&echo/&echo===================================>>list.txt
        for /f "delims== tokens=2" %%i in ('nbtstat -a 192.168.0.%%a^|find "MAC Address"') do echo %%i------------192.168.0.%%a >>list.txt
)
pause
notepad.exe list.txt
goto :eof

作者: ygzxw     时间: 2006-12-29 05:34


  Quote:
Originally posted by lxmxn at 2006-12-28 04:30 PM:

  内网IP是什么打头的?不是192.168.1.……之类的么?

不懂,请指教!?
作者: ygzxw     时间: 2006-12-29 05:40


  Quote:
Originally posted by lxmxn at 2006-12-28 04:32 PM:

  再试试:[code]
@echo off
for /l %%a in (1,1,254) do (
        echo.&echo/&echo===================================>>list.txt
        for /f "deli ...

测试结果跟上次相同!我第一次测试的时候,给IP:192.168.1....的1改成0了的!!
作者: ygzxw     时间: 2006-12-29 05:56
这次测试耗时10分钟(批处理文件好象还在运行)的结果:
list.txt
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
00-0A-EB-F9-0F-F4
------------192.168.0.28
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
==================================
奇怪,只扫描到一台ip,mac

[ Last edited by ygzxw on 2006-12-28 at 04:58 PM ]
作者: lxmxn     时间: 2006-12-29 06:02

@echo off
set/p=>list.txt<nul
for /l %%a in (1,1,254) do (
        echo.&echo.
        for /f "delims== tokens=2" %%i in ('nbtstat -A 192.168.0.%%a^|find "MAC Address"') do (
                echo==========================>>list.txt
                echo %%i=======192.168.0.%%a >>list.txt
        )
)
pause
start list.txt
goto :eof

作者: lxmxn     时间: 2006-12-29 06:03

  不会是你的内网主机做了什么限制吧?我测试我自己的可以得到结果啊。

作者: ygzxw     时间: 2006-12-29 06:12
我这台计算机,没做任何限制!这个局域网,我是网管!!!!!

[ Last edited by ygzxw on 2006-12-28 at 05:15 PM ]
作者: lxmxn     时间: 2006-12-29 06:18

  那你随便拿个内网IP测试一下,比如:nbtstat -a 192.168.0.24,看看结果是什么?

作者: 9527     时间: 2006-12-29 06:36

@echo off
arp -d
for /l %%i in (0,1,128) do ping 192.168.1.%%i -n 1 >nul
arp -a >11.txt
arp -d
for /l %%i in (128,1,255) do ping 192.168.1.%%i -n 1 >nul
arp -a >>11.txt
arp -d

作者: ygzxw     时间: 2006-12-29 06:36
CODE:  [Copy to clipboard]
--------------------------------------------------------------------------------

@echo off
set/p=>list.txt<nul
for /l %%a in (1,1,254) do (
        echo.&echo.
        for /f "delims== tokens=2" %%i in ('nbtstat -A 192.168.0.%%a^|find "MAC Address"') do (
                echo==========================>>list.txt
                echo %%i=======192.168.0.%%a >>list.txt
        )
)
pause
start list.txt
goto :eof

现在可以了,就是速度奇慢!!!!

测试结果:
=========================
00-0A-EB-F9-0F-**
=======192.168.0.28
=========================
00-05-5D-5D-A0-**
=======192.168.0.60
=========================
00-E0-4C-C4-3E-**
=======192.168.0.63
=========================
00-0A-EB-6F-4E-**
=======192.168.0.65
=========================
00-0A-EB-F9-0F-**
=======192.168.0.66

[ Last edited by ygzxw on 2006-12-28 at 05:47 PM ]
作者: lxmxn     时间: 2006-12-29 06:57

  速度慢的主要原因是nbtstat命令检测到不是活动的IP的延迟造成的。

作者: ygzxw     时间: 2006-12-29 07:10
我的明白,谢谢了!
作者: ccwan     时间: 2006-12-29 07:27
糟糕,把技术教给日本人了。
作者: qzwqzw     时间: 2006-12-29 07:34
扫描MAC不用nbtstat

先用ping -n 1 -w 10 IP,再用arp -a | find "IP"是比较好的方案

因为使用ping可以快速检测连接

命令行下的方案

for /l %l in (1,1,254) do @(ping -n 1 -w 10 192.168.0.%l>nul && arp -a | find " 192.168.0.%l ")
作者: qzwqzw     时间: 2006-12-29 07:46
sorry,刚看到9527的方案,我的作废吧

不知道WIN的arp表到底可以有多大?
作者: tao0610     时间: 2006-12-29 07:54
其实用批处理命令靠IP得到的MAC表,都不能保证真实性.
作者: tghksj     时间: 2006-12-30 23:25
re lxmxn
-----------------------
net view得到"计算机名"列表
nbtstat -a "计算机名" 得到 MAC
------------------------
@ECHO %dbg% OFF
setlocal ENABLEDELAYEDEXPANSION

for /f "tokens=1" %%i in ('net view') do (
                                          SET COMPUTERNAME=%%i
                                          CALL :CNAME
                                          )


:CNAME
IF NOT %COMPUTERNAME:~0,2%==\\ GOTO :EOF
SET COMPUTERNAME=%COMPUTERNAME:~2%
FOR /F "skip=1 tokens=4" %%j in ('nbtstat -a %COMPUTERNAME%^|FINDSTR /I MAC') do (
                                         ECHO %COMPUTERNAME% %%j
                                         )
GOTO :EOF
[ Last edited by tghksj on 2006-12-30 at 12:34 PM ]
作者: mackyliu     时间: 2006-12-31 00:43
批处理也是要有系统服务支持的.
例如我公司的局域网,都是单机上网,不需要共享,Server服务都没开,通过路由上网的,DHCP自动获取IP,这种情况我看这个批处理就没有用武之地了
作者: lxmxn     时间: 2006-12-31 00:55

  根据 9527 和 qzwqzw 的思路,我是这样理解的:当ping完一个IP之后,如果这个IP所代表的主机是存活的,那么就会自动在路由表中记录这个IP和其MAC,但是我试了一下ping www.cn-dos.net,之后我用ARP -A,路由表中并没有出现www.cn-dos.net的IP以及MAC,请教这是什么原因?是不是这种方法只针对内网的主机呢?请各位不吝赐教。

作者: 9527     时间: 2006-12-31 01:13

PING虽然也可以判断对方机器是否在线,不过成功率实在不敢恭维,效率也差的要命,还是用ARP好些,不过使用他的人一定要注意他的网段是192.168.1.0-192.168.1.255这个大家根据自己的情况改好了,不过运行速度不是太快,可能是PING给延误的,不过确实很实用的,大概解释一下,有人会问了,为什么你不直接把整段IP给FOR运行呢,我昨天试验了下,那样有些不准,所以分两段运行了,具体为什么不准这个我也不是很清楚,对于有防火墙的情况也是适用的,对屏蔽了ICMP包的机器也是适用的,因为他一定还给一个MAC地址给源计算机的,所以请大家放心使用就是了.
这是我原帖所写内容,你在从网上查一下,ARP好像只对内部网络操作有作用,对其外网是否存活好像基础命令是PING对方主机看TTL值,ARP就有一个好处那就是如果对方在线不管在线不在线对能够判断出来!!!
作者: lxmxn     时间: 2006-12-31 02:01


  Quote:
Originally posted by tghksj at 2006-12-30 10:25:
re lxmxn
-----------------------
net view得到"计算机名"列表
nbtstat -a "计算机名" 得到 MAC
------------------------


[code]
@ECHO %dbg% OFF
setlocal ENAB ...


  将你的net view和nbtstat -a [计算机名]得到的具体结果发来看看,我主要是看一下结果的格式,因为我这里没有内网环境。

作者: tghksj     时间: 2006-12-31 02:13

net view :
--------------
服务器名称            注释

-------------------------------------------------------------------------------
\\GS                                                                           
\\SERVER                                                                       
\\T06                                                                          
\\T11                                                                          
\\T13                                                                          
\\T14                                                                          
\\T16                                                                          
\\T18                                                                          
\\T19                                                                          
\\T20                                                                          
\\T22                                                                          
\\T23                                                                          
\\T24                                                                          
\\T25                                                                          
\\T27                                                                          
\\T28                                                                          
\\T29                                                                          
\\T34                                                                          
\\T46                                                                          
\\T49                                                                          
\\T50                                                                          
\\T51                                                                          
\\T52                                                                          
\\T53                                                                          
\\T54                                                                          
\\T60                                                                          
命令成功完成。

--------------------------------------------
nbtstat -a T06:
---------------------------
   
本地连接:
Node IpAddress: [222.173.24.71] Scope Id: []



           NetBIOS Remote Machine Name Table



       Name               Type         Status

    ---------------------------------------------

    T06            <00>  UNIQUE      Registered

    K              <00>  GROUP       Registered

    T06            <20>  UNIQUE      Registered

    K              <1E>  GROUP       Registered



    MAC Address = 00-E0-4C-10-44-49
nbtstat -a 命令竟然大小写结果不同........
NBTSTAT -A 不行......
作者: trickster     时间: 2006-12-31 02:46


  Quote:
Originally posted by ygzxw at 2006-12-28 04:12 PM:
这儿不让传图!!!发不了

可以发的,在你发贴时在最下面有提示:
  
   图1
  上传完成后根据提示找到文件连接地址即可.

      

[ Last edited by trickster on 2006-12-30 at 01:54 PM ]
作者: everest79     时间: 2006-12-31 02:58
有个命令很方便,也不需要server服务来支持 arp -a ipaddress
作者: lxmxn     时间: 2006-12-31 03:04

@echo %dbg% off
setlocal enabledelayedexpansion

for /f "tokens=1 delims=\" %%i in ('net view^|find "\\"') do (
        call :cname %%i
)
pause
goto :eof

:cname
for /f "tokens=2 delims==" %%j in ('nbtstat -a %1^|find "MAC Address"') do (
        echo %1_%%j
)
goto :eof
  再试试看?


[ Last edited by lxmxn on 2006-12-30 at 03:17 PM ]
作者: tghksj     时间: 2006-12-31 04:04
粗心了:)
少了个 '
应该是for /f "tokens=1 delims=\" %%i in ('net view^|find "\\"') do (
作者: lxmxn     时间: 2006-12-31 04:18

  呵呵,谢谢楼上兄的提醒。由于没有环境,所以代码写好了就直接发上来了,没有测试。 =_=||

作者: qzwqzw     时间: 2006-12-31 06:06
arp -a 显示的并非路有表,而是ARP缓存表

前者是网络层的数据结构

后者是通过发送arp广播消息建立的,是个典型的数据链路层数据结构

数据链路层消息是不能跨网关的,所以只能在同一网段内(或者同一VLAN)

一个局域网内可能有多个网段或VLAN
---------------------------------------------

arp 并不比 ping 更好些,因为他们不是同一层次的程序

windows 的 arp 程序只操作本地arp缓存表,没有发出任何网络连接

所以如果不连接目标IP,是不可能arp 到mac的

所以,ping或者其他连接程序是 arp 的前提

除非有个arp程序可以自己发出arp请求消息
-------------------------------------------------------------------------

是否ping通与是否获取mac没有直接关系

因为ping采用icmp协议,位于网络层

网络层失败,并不意味着更低的数据链路层失败

但数据链路层失败,则网络层一定失败

所以,能ping通,就一定可以获得mac

能获得mac却不一定可以ping通

---------------------------------------------------------------------------------

印象中arp缓存表只保留10条最新的ip-mac记录

所以可能无法一次获取128条记录

但没有条件做测试,也很难说,这与系统有关,与协议无关

--------------------------------------------------------------------------------
作者: vkill     时间: 2006-12-31 06:13
应该先看看 $ipc
作者: lxmxn     时间: 2006-12-31 06:42

  多谢40楼兄的指点,明白一些了。

作者: everest79     时间: 2006-12-31 06:51


  Quote:
Originally posted by qzwqzw at 2006-12-30 05:06 PM:
arp -a 显示的并非路有表,而是ARP缓存表

前者是网络层的数据结构

后者是通过发送arp广播消息建立的,是个典型的数据链路层数据结构

数据链蠮..

刚才没注意看,以为是要获得ping以后的MAC地址
arp本地缓存应支持超过256个条目
作者: everest79     时间: 2006-12-31 06:54

@echo off
FOR /F "tokens=4-7 delims=. " %%i IN ('ipconfig^|find /i "ip address"') do set i1=%%i&set i2=%%j&set i3=%%k&set i4=%%l
FOR /F "tokens=4-7 delims=. " %%i IN ('ipconfig^|find /i "subnet"') do set m1=%%i&set m2=%%j&set m3=%%k&set m4=%%l
if "%m2%" == "0" (set b=1&set bb=254) else set b=%i2%&set bb=%i2%
if "%m3%" == "0" (set c=1&set cc=254) else set c=%i3%&set cc=%i3%
echo.>mac.dat
for /l %%b in (%b%,1,%bb%) do (
for /l %%c in (%c%,1,%cc%) do (
for /l %%d in (1,1,20) do (
ping -l 1 -w 1 -n 1 -i 1 %i1%.%%b.%%c.%%d>nul
arp -a %i1%.%%b.%%c.%%d|find "%i1%.%%b.%%c.%%d"|findstr "static dynamic">>mac.dat
set /p=%%d <nul)
)
)
echo.
type mac.dat
pause
我这也有一个,原来配置交换机时写的
作者: qzwqzw     时间: 2006-12-31 09:11
写的不错

再完善一下就可以做标配工具了

首先是对非0的掩码的支持

其次是对(1,1,20)的问题,不知道你是如何考虑的,是抽样吗?

另外,arp的条目总数不知是否系统版本影响

如果确定不低于256,那么为什么不在ping完一个段后,再arp -a呢
作者: everest79     时间: 2006-12-31 11:45
不能确定缓存刷新时间,万一PING时间长了,可能就刷掉了,还有我说256是指静态MAC,也就是绑定的,非绑定的没条件测试
1,1,20是我在本地测试时填的,没有改回来
非三类掩码的计算没有写,因为子网IP段是各类IP的一部分,还是可以PING到,只要不怕耗时间^_^
作者: everest79     时间: 2006-12-31 11:47
附一个很早以前写的批处理
@ECHO OFF
set dataA=0 128 192 224 240 248 252 254 255
set ier=输入错误! key:
set con=999
if not "%1" == "" (set con=1&&set go=des) else goto int
if not "%1" == "" echo %1|find ".">nul&&set go=int
goto %go%


:int
cls
if %con% equ 1 (set mask=%1&&set con=0) else set /p mask=MASK:
:chk1
SETLOCAL ENABLEDELAYEDEXPANSION
for /f "tokens=1-4 delims=." %%a in ("%mask%") do if %%a lss 128 (cls&echo %mask% %ier%1 %%a^>128&goto int) else set m_1=%%a&set m_2=%%b&set m_3=%%c&set m_4=%%d
for /f "tokens=2,3 delims==_" %%i in ('set m_') do echo %%j|findstr /v /b /e "%dataA%"&&cls&&echo %mask% %ier%2&&echo 第%%i段 %%j&&goto int
set /a _tmp1=%m_1%+%m_2%+%m_3%+%m_4%
set /a _tmp2=4
:chk2
set /a _tmp3=!m_%_tmp2%!
if not "%_tmp3%" == "0" (echo.) else set /a _tmp2=%_tmp2%-1&&goto chk2
set /a _tmp4=%_tmp1%-%_tmp3%
set /a _tmp5=%dataA:~-3%*(%_tmp2%-1)
if %_tmp4% == %_tmp5% (goto next) else echo %mask% %ier%3&goto int

:next
set /a des1=%_tmp2%*8-8
if "%_tmp3%" == "%dataA:~2,3%" set des2=1
if "%_tmp3%" == "%dataA:~6,3%" set des2=2
if "%_tmp3%" == "%dataA:~10,3%" set des2=3
if "%_tmp3%" == "%dataA:~14,3%" set des2=4
if "%_tmp3%" == "%dataA:~18,3%" set des2=5
if "%_tmp3%" == "%dataA:~22,3%" set des2=6
if "%_tmp3%" == "%dataA:~26,3%" set des2=7
if "%_tmp3%" == "%dataA:~30,3%" set des2=8
set /a des=%des1%+%des2%
echo MASK:%mask%=%des%
ENDLOCAL
goto end

:des
cls
if "%1" == "mask" set con=0
if %con% equ 1 (set mask=%1&&set con=0) else set /p mask=MASK:

:ce
echo %mask%|find "- ."&&cls&&echo %mask% %ier%1&&goto des
set /a mask1=%mask%/8
set /a mask2=%mask%%%8
set /a chk=%mask1%+%mask2%
if %chk% gtr 0 (if %chk% gtr 4 (cls&&echo %mask% %ier%2&&goto des)) else cls&&echo %mask% %ier%3&&goto des  
set s1=0&set s2=0&set s3=0&set s4=0&set s5=%mask1%
if "%mask1%" == "0" (set s0=%mask%&&goto ct) else set s0=%mask2%

:cf
set s%s5%=255
set /a s5=%s5%-1
if not "%s5%" == "0" goto cf

:ct
if "%s0%" == "0" set s=%dataA:~0,1%
if "%s0%" == "1" set s=%dataA:~2,3%
if "%s0%" == "2" set s=%dataA:~6,3%
if "%s0%" == "3" set s=%dataA:~10,3%
if "%s0%" == "4" set s=%dataA:~14,3%
if "%s0%" == "5" set s=%dataA:~18,3%
if "%s0%" == "6" set s=%dataA:~22,3%
if "%s0%" == "7" set s=%dataA:~26,3%
if "%s0%" == "8" set s=%dataA:~30,3%
set /a _tmp=%mask1%+1
set s%_tmp%=%s%
echo %mask%=%s1%.%s2%.%s3%.%s4%

:end
pause>nul
exit

作者: dikex     时间: 2006-12-31 12:06


  Quote:
Originally posted by everest79 at 2006-12-30 10:45 PM:
不能确定缓存刷新时间,万一PING时间长了,可能就刷掉了,还有我说256是指静态MAC,也就是绑定的,非绑定的没条件测试
1,1,20是我在本地测试时填的 ...

对此我们可以作出以下的改动

  Quote:
@echo off
arp /d
FOR /L %%i IN (1,1,255) Do start /b ping 192.168.1.%%i -n 1 -w 0 >nul
arp /a | find "dynamic">IP.txt
type ip.txt
pause

我们的目的只是刷新本地的arp缓存,而当我们发出一个请求的arp数据包,只要对方的主机在就会回应那个arp数据包,我们本机的arp缓存就会刷新,而那个ping的数据包我们根本不用理会它,所以可以把等待时间设为0;
而且在for循环里使用start可以使得ping能并行运行,可以大大缩短运行的时间(代价是资源占用率高),由于运行地很快到最后会发现有一些mac全部为0的地址还没有消失,这是使用find寻找带用dynamic的行即可;
个人觉得这个批处理在局域网中还是挺有用的。

[ Last edited by dikex on 2006-12-30 at 11:08 PM ]
作者: INeverAsk     时间: 2007-11-4 23:19
此贴收下,多谢
作者: niao22     时间: 2008-4-1 00:10
如果跨VLAN,这结就不好用了
作者: Climbing     时间: 2008-4-1 00:52
这个程序应该自动检测本机的IP地址及子网掩码,然后根据IP地址和子网掩码判断局域网的大小,然后再进行检测,呵呵。
作者: densn     时间: 2008-4-2 22:45
局域网内MAC扫描
http://www.cn-dos.net/forum/viewthread.php?tid=38988&fpage=1