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
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
Originally posted by lxmxn at 2006-12-28 04:30 PM:   内网IP是什么打头的?不是192.168.1.……之类的么?
不懂,请指教!?

作者: ygzxw     时间: 2006-12-29 05:40
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
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
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
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
Originally posted by everest79 at 2006-12-30 10:45 PM: 不能确定缓存刷新时间,万一PING时间长了,可能就刷掉了,还有我说256是指静态MAC,也就是绑定的,非绑定的没条件测试 1,1,20是我在本地测试时填的 ...
对此我们可以作出以下的改动
@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扫描 www.cn-dos.net/forum ...