Board logo

标题: 如何跳过没有响应的扫描? [打印本页]

作者: pzf2008     时间: 2009-3-2 04:33    标题: 如何跳过没有响应的扫描?

用一个命令行下的扫描工具scan.exe对文本文件123.txt中的IP列表进行逐个扫描,批处理的代码如下:
@for /f %%i in (123.txt) do scan %%i

有的IP很快就扫描完毕,但是有的IP会没有响应,使得命令执行很慢。要实现不管目标IP是否有响应,每个IP均在20秒内扫描完成,然后跳到下一个IP。如何修改代码呢?请各位指点高明!
作者: pzf2008     时间: 2009-3-2 21:56
到现在还没有高人来指点啊?可能是我没说清楚吧!

我的意思就是:每次在执行命令后,加一个时间控制,如20秒钟,20秒钟之后,直接执行下一个循环的命令。怎么实现呢?

[ Last edited by pzf2008 on 2009-3-2 at 22:33 ]
作者: netbenton     时间: 2009-3-3 01:21
for 调用scan.exe时,是把所有的控制权都交给scan.exe 了的,不可以中途打断的
你看看你的scan.exe它有没有定时的功能吧
作者: pzf2008     时间: 2009-3-3 03:55
scan.exe相当于一个DOS下的命令行程序,就像dir等命令一样,没有定时功能。

我想实现对每个IP执行scan命令时,如果时间超过20秒钟,就自动跳到下一个循环执行。
或者,实现如下的键盘功能:
扫描一个IP超过20秒钟后,就用代码实现按下键盘的"Ctrl + c",然后按下"N",不取消该批处理命令,并继续执行下一条命令。

可否用代码模拟实现?
作者: yishanju     时间: 2009-3-3 06:24
扫描前先PING ,PING 不通 的IP 不扫描
这样可以不
作者: pzf2008     时间: 2009-3-3 10:56
不行!这个scan程序是和ping命令的原理不一样! 还是得用代码来取消失去响应的命令,并跳到下一循环。

[ Last edited by pzf2008 on 2009-3-3 at 21:58 ]
作者: pzf2008     时间: 2009-3-3 22:11
也就是说,如果有以下批处理命令:
dir c:
dir d:
dir e:
dir f:
dir g:

假设每个磁盘驱动器上的文件有1亿个,dir命令要执行很久,要实现执行每条dir命令20秒钟后,取消该条命令的执行,相当于按下键盘的"Ctrl + c",然后再按下"N",跳到下一条dir命令继续执行。

实现这样的功能,要在中间插入什么代码呢?
作者: yishanju     时间: 2009-3-4 00:24
3楼已经说明方向了
自己看看SCAN的帮助
或者传一份scan 上来看看
别把木马后门-之类传上来就行
作者: netbenton     时间: 2009-3-4 02:23    标题: 楼主试试这个行吗?

@echo off
echo.@echo off>%~n0scan.bat
echo.title %%1%%2>>%~n0scan.bat
echo.scan %%2>>%~n0scan.bat
echo.echo.ok>>%~n0scan.bat
echo.title bentonok>>%~n0scan.bat
echo.pause>>%~n0scan.bat

for /f %%i in (bbb.txt) do call :sub %%i
del /q %~n0scan.bat
goto :eof
:sub
start %~n0scan.bat benton %1
for /f "tokens=2" %%a in ('TASKLIST /FI "WINDOWTITLE eq benton%1*" /fo "table" /nh') do set pid=%%a
set n=0
:lp
set/a n+=1
if %n% gtr 20 goto :close
ping 127.1 -n 1 >nul
for /f "tokens=9*" %%a in ('TASKLIST /FI "pid eq %pid%" /v /nh') do echo.%%~nxb&if "%%~nxb"=="benton%1" goto :lp
:close
rem TASKkill /FI "pid eq %pid%"
TASKkill /FI "WINDOWTITLE eq benton*" >nul
goto :eof

[ Last edited by netbenton on 2009-3-4 at 00:27 ]
作者: netbenton     时间: 2009-3-4 02:35    标题: 这个雅观一点

@echo off
echo.@echo off>%~n0scan.bat
echo.title %%1%%2>>%~n0scan.bat
echo.scan %%2>>%~n0scan.bat
echo.title bentonok>>%~n0scan.bat
echo.pause>>%~n0scan.bat

for /f %%i in (123.txt) do call :sub %%i
del /q %~n0scan.bat
echo.scan finish
pause
goto :eof
:sub
echo.scan %1
start /min %~n0scan.bat benton %1
(for /f "tokens=2" %%a in ('TASKLIST /FI "WINDOWTITLE eq benton%1*" /fo "table" /nh') do set pid=%%a)2>nul
set n=0
:lp
set/a n+=1
if %n% gtr 20 goto :close
ping 127.1 -n 1 >nul
(for /f "tokens=9*" %%a in ('TASKLIST /FI "pid eq %pid%" /v /nh') do if "%%~nxb"=="benton%1" goto :lp)2>nul
:close
TASKkill /FI "WINDOWTITLE eq benton*" >nul
goto :eof

[ Last edited by netbenton on 2009-3-5 at 07:48 ]
作者: pzf2008     时间: 2009-3-4 21:32    标题: To:netbenton

netbenton的代码真如蝴蝶穿花,够深奥!可我测试后,不行啊,没有完成需要的操作。

执行时生成了一个名为"testscan.bat"的批处理文件,其内容如下:
@echo off
title %1%2
scan.exe %2
title bentonok
pause

假如要实现7楼描述的需求,代码应该怎么写呢?

[ Last edited by pzf2008 on 2009-3-4 at 21:57 ]
作者: netbenton     时间: 2009-3-5 09:43
不好意思,原来是测试部分还没有去掉,改好了(10楼):

红色部分为IP列表文件,
绿色部分为你的scan.exe文件,
橙色部分的数字为延时,可以根据需要改
蓝色部分为scan.exe扫描时窗口最小化了,可以去掉。

==================================
原理如下:
前面的echo部分产一个临时??scan.bat文件,用来调用scan.exe,

主批处理读取123.txt里面的IP列表,在新窗口调用临时产的??scan.bat
并给它一个字符串(用作标题)和一个IP,然后检测其是否完成(标题改变),或超时
是则关闭该窗口。再读取下一IP. . . 直到结束。

新窗口做的事情是:
把标题设置为主批给定的内容,再调用scan IP,完成后把标题设为OK。pause...
等主批来关闭。

[ Last edited by netbenton on 2009-3-5 at 08:09 ]