如何 ping 和导出跨子网设置的 ip 范围的结果

Posted

技术标签:

【中文标题】如何 ping 和导出跨子网设置的 ip 范围的结果【英文标题】:How to ping, and export results for set ip ranges across subnets 【发布时间】:2016-03-23 21:21:16 【问题描述】:

我正在尝试修改我在网上找到的 Bat 文件以满足我的需要。

@ECHO Off
set startTime=%500%
ECHO Starting the IP Scan
FOR /L %%i IN (1,1,2) DO @(
ECHO Pinging IP Range: 10.163.%%i._
FOR /L %%z IN (1,1,10) DO @(
echo Pinging IP: 10.163.%%i.15
ping -n 1 -w 500 10.163.%%i.15 | FIND /i "Reply">>IPScanResults.txt
)
)
ECHO Run Time = %startTime% to %time%>>IPScanResults.txt
ECHO *** IP Scan Complete. ***
ECHO Check the file called IPScanResults.txt to see the results
ECHO Run Time = %startTime% to %time%

手头的问题...我们在全国数百个办事处都有网络打印机。我们公司使用差异有限的通用标准。所有打印机都以 15 或 16 的第 4 个八位字节结束。变量将是 IP 的第 2 个和第 3 个八位字节。我可以为第二个八位字节变量制作第二个脚本,我的最大障碍是第三个八位字节和输出。比如……

我需要 ping 并识别来自 10.163.X.15 或 10.163.X.16 IP 地址内任何机器的响应,并将其导出到带有响应的 txt 文件。 X的范围是1-254。只需要一个 ping 响应,我不需要它响应 4-5 个响应,因为它只是一个“你在吗”测试。然后,我将使用 10.162.x.x 和 10.160.x.x 为我们的网络编辑它

我对脚本编写不是很熟悉,但很想了解更多有关如何完成此操作的信息。谢谢!

【问题讨论】:

set startTime=%500% 是干什么用的?永远不要使用仅由数字组成的变量名,因为% 后跟一个数字有另一种含义——输入call /? 获取信息... 【参考方案1】:

你快到了,你只是从不使用内部for /L循环的变量%%z

@ECHO OFF
SET startTime=%time%
ECHO Starting the IP Scan
FOR /L %%i IN (1,1,2) DO (
    ECHO Pinging IP Range: 10.163.%%i._
    FOR /L %%z IN (1,1,10) DO (
        ECHO Pinging IP: 10.163.%%i.%%z
        PING -n 1 -w 500 10.163.%%i.%%z | FIND /i "Reply">>"IPScanResults.txt"
    )
)
ECHO Run Time = %startTime% to %time%>>"IPScanResults.txt"
ECHO *** IP Scan Complete. ***
ECHO Check the file called "IPScanResults.txt" to see the results
ECHO Run Time = %startTime% to %time%

我使用这个变量作为第四个八位字节(而不是常量15),所以控制台输出是这样的:

Starting the IP Scan
Pinging IP Range: 10.163.1._
Pinging IP: 10.163.1.1
Pinging IP: 10.163.1.2
  ...
Pinging IP: 10.163.1.10
Pinging IP Range: 10.163.2._
Pinging IP: 10.163.2.1
Pinging IP: 10.163.2.2
  ...
Pinging IP: 10.163.2.10
*** IP Scan Complete. ***
Check the file called "IPScanResults.txt" to see the results
Run Time =  0:05:07.24 to  0:05:17.16

...日志文件IPScanResults.txt 的内容可能如下所示:

Reply from 10.163.1.10: bytes=32 time<1ms TTL=128
Run Time =  0:05:07.24 to  0:05:17.16

此外,我缩进了 for /L 循环以提高可读性,并且我在日志文件名周围加上了引号,因此它可能会被更改,以便它甚至包含空格而没有任何问题。

此外,我用%time% 交换了%500%,因为我假设你想存储开始时间。 %500% 是一个无效的变量名,因为% 后跟一个数字(在这种情况下为%5)表示脚本参数扩展——有关更多信息,请参阅call /?


提示: 如果其中一个八位字节没有连续值,例如160162163,则可以使用标准的for 循环而不是for /L

FOR %%j IN (160 162 163) DO (
    PING -n 1 -w 500 10.%%j.1.15
)

无论如何,由于它的灵活性,我很可能会使用以下脚本完成您的任务:

@echo off
setlocal EnableExtensions EnableDelayedExpansion

rem Define constants here:
set "LOGFILE=IPScanResults.txt"
rem Define IP octets here:
set "OCTET1=10"          & rem (a single value)
set "OCTET2=160 162 163" & rem (space-separated list of values)
set "OCTET3=1,1,254"     & rem (comma-separated range (min.,step,max.))
set "OCTET4=15,1,16"     & rem (comma-separated range (min.,step,max.))

rem Prepare `for` switch `/L` dynamically:
for /L %%O in (1,1,4) do (
    if not "!OCTET%%O!"=="!OCTET%%O:,=!" set "SWITCH%%O=/L"
)

set "STARTTIME=%TIME%"
if exist "%LOGFILE%" (>> "%LOGFILE%" echo()
echo Starting the IP Scan
for %SWITCH1% %%I in (%OCTET1%) do (
    for %SWITCH2% %%J in (%OCTET2%) do (
        echo Pinging IP Range: %%I.%%J.__.__
        for %SWITCH3% %%K in (%OCTET3%) do (
            for %SWITCH4% %%L in (%OCTET4%) do (
                echo Pinging IP: %%I.%%J.%%K.%%L
                ping -n 1 -w 500 %%I.%%J.%%K.%%L | >> "%LOGFILE%" find "TTL"
            )
        )
    )
)
>> "%LOGFILE%" echo Run Time = %STARTTIME% -- %TIME%
echo *** IP Scan Complete. ***
echo Check the file called "%LOGFILE%" to see the results.
echo Run Time = %STARTTIME% -- %TIME%

endlocal
exit /B

【讨论】:

这太棒了!有没有办法自动为 CSV 文件添加标题? 哪个“CSV 文件”?你是在说日志文件IPScanResults.txt吗?我猜你想在第一次写标题时写一个标题(所以当它最初创建时),但如果文件被附加到,你不想要标题,对吧?如果是这样,您可以扩展if exist "%LOGFILE%" (&gt;&gt; "%LOGFILE%" echo() 行,在文件已经存在的情况下插入一个空行(echo();所以只需附加 SPACE + else echo(Header&amp;echo( 以添加带有文本 Header 后跟空行的标题,例如... 这是我已经从您的脚本中修改的内容......但它并没有像我预期的那样出现......如果存在“%LOGFILE%”(>>“IPScanResults”,请设置“STARTTIME=%TIME%” .txt" echo (header&echo() echo 开始对 %SWITCH1% %%I in (%OCTET1%) 执行 IP 扫描 ( 很难判断哪里出了问题,就像在 cmets 中一样,代码格式很差;也许应该删除echo(header 之间的空格... 对格式化很抱歉。习惯评论部分。生病尝试建议的格式更改。非常感谢。

以上是关于如何 ping 和导出跨子网设置的 ip 范围的结果的主要内容,如果未能解决你的问题,请参考以下文章

linux 怎样设置外网ip、网关、掩码

DHCP跨网段分配IP地址配置

centos7ping不稳定

ubuntu双网卡双IP.不同网关.不同子网.如何同时ping通两块网卡

如何跨网段取MAC地址

【php】外部主机访问虚拟机IP,自动跳转IIS7