在windows服务器上,经常需要批量telnet大量地址段端口,来确认网络是否畅通。如果一个个telnet耗时耗力,使用其他第三方程序,则担心不合规,有影响。因此考虑使用windows批处理或者powershell来编写

思路

  • 写一个input文件,将ip和端口信息保存
  • 脚本从input文件逐行读取,循环telnet,将不通的端口记录,输出到output中

powshell

$ports = @(60000)  # 设置要测试的端口列表
$ipFile = "C:\Users\Administrator\Desktop\ip_list.txt"   # 设置包含IP地址的文本文件路径
$outputFile = "C:\Users\Administrator\Desktop\result.txt"  # 设置输出结果的文本文件路径

$ipAddresses = Get-Content $ipFile

foreach ($ip in $ipAddresses) {
    foreach ($port in $ports) {
        $tcpClient = New-Object System.Net.Sockets.TcpClient
        try {
            $connectTask = $tcpClient.ConnectAsync($ip, $port)
    
            # 等待连接完成或超时(设置为3秒)
            $waitResult = [System.Threading.Tasks.Task]::WaitAny($connectTask, [System.Threading.Tasks.Task]::Delay(3000))
    
            if ($waitResult -eq 0 -and $tcpClient.Connected) {
                $result = "IP $ip Port $port is open."
            } else {
                $result = "IP $ip Port $port is closed."
            }
        } catch {
            $result = "Failed to connect to IP $ip Port ${port}: $_"
        } finally {
            $tcpClient.Close()
        }
        $result | Out-File -FilePath $outputFile -Append
    }
}

批处理

@echo off

set INPUT_FILE=input.txt
set OUTPUT_FILE=output.txt
set FAILURES_FILE=failures.txt

REM 清空输出文件和失败记录文件
break > %OUTPUT_FILE%
break > %FAILURES_FILE%

REM 逐行读取输入文件
for /f "tokens=*" %%A in (%INPUT_FILE%) do (
    echo Connecting to %%A
    telnet %%A >> %OUTPUT_FILE% 2>&1
    
    REM 检查telnet命令的退出代码
    if not errorlevel 1 (
        echo Telnet to %%A succeeded.
    ) else (
        echo Telnet to %%A failed. >> %FAILURES_FILE%
    )
    
    echo. >> %OUTPUT_FILE%
)

echo 批量 telnet 执行完成,成功记录保存在 %OUTPUT_FILE% 文件中,失败记录保存在 %FAILURES_FILE% 文件中。
pause

powershell写起来较为复杂,批处理执行有问题,有些系统运行得不到结果

可以根据自己的情况取舍