windows脚本实现扫描服务器端口开放情况,使用大模型给出的答案,实测可用。
创建文件PortScanner.ps1,内容如下:

# 静默多线程端口扫描脚本
param(
    [Parameter(Mandatory=$true)]
    [string]$target,
    
    [Parameter(Mandatory=$true)]
    [int]$startPort,
    
    [Parameter(Mandatory=$true)]
    [int]$endPort,

 [int]$threads = 20,  # 并发线程数
 [int]$timeout = 300
)

$totalPorts = $endPort - $startPort + 1
$openPorts = [System.Collections.Concurrent.ConcurrentBag[int]]::new()


# 创建运行空间池
$pool = [RunspaceFactory]::CreateRunspacePool(1, $threads)
$pool.Open()
$jobs = New-Object System.Collections.Generic.List[System.Object]

# 进度计数器
$completed = 0
$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()

Write-Host "`n[静默扫描模式] 目标: $target 端口: $startPort-$endPort (线程数: $threads)`n" -ForegroundColor Cyan

# 定义扫描函数(严格模式)
$scriptBlock = {
    param($target, $port, $timeout)
    try {
        $result = Test-NetConnection -ComputerName $target -Port $port `
            -InformationLevel Quiet `
            -WarningAction SilentlyContinue `
            -ErrorAction Stop
        
        # 严格结果验证
        if ($result -eq $true) {
            return [PSCustomObject]@{
                Port = $port
                Status = "Open"
            }
        }
    }
    catch {
        # 静默处理所有异常
    }
    return $null
}

# 批量提交任务
foreach ($port in $startPort..$endPort) {
    $ps = [PowerShell]::Create().AddScript($scriptBlock).AddArgument($target).AddArgument($port).AddArgument($timeout)
    $ps.RunspacePool = $pool
    $jobs.Add([PSCustomObject]@{
        Async = $ps.BeginInvoke()
        PowerShell = $ps
        Port = $port
    })
}

# 实时处理结果(静默模式)
while ($jobs.Count -gt 0) {
    $jobsToRemove = New-Object System.Collections.Generic.List[System.Object]
    
    foreach ($job in $jobs.ToArray()) {
        if ($job.Async.IsCompleted) {
            $result = $job.PowerShell.EndInvoke($job.Async)
            
            if ($result -and $result.Status -eq "Open") {
                $openPorts.Add($result.Port)
                Write-Host "发现开放端口:$($result.Port)" -ForegroundColor Green
            }
            
            $job.PowerShell.Dispose()
            $jobsToRemove.Add($job)
            $completed++
        }
    }
    
    # 更新进度
    $progress = ($completed / $totalPorts) * 100
    Write-Progress -Activity "静默扫描中" `
        -Status "进度: $completed/$totalPorts | 开放: $($openPorts.Count)" `
        -PercentComplete $progress
    
    # 移除已完成任务
    foreach ($job in $jobsToRemove) {
        $jobs.Remove($job)
    }
    
    Start-Sleep -Milliseconds 100
}

# 输出最终结果
$stopwatch.Stop()
Write-Host "`n════════ 扫描报告 ════════" -ForegroundColor Cyan
Write-Host "扫描耗时: $($stopwatch.Elapsed.ToString('hh\:mm\:ss'))"
Write-Host "扫描范围: $startPort-$endPort | 开放端口: $($openPorts.Count)" -ForegroundColor Yellow

if ($openPorts.Count -gt 0) {
    Write-Host "`n[已确认开放端口]" -ForegroundColor Green
    $openPorts | Sort-Object | ForEach-Object { 
        Write-Host "端口 $_" -ForegroundColor Green
    }
} else {
    Write-Host "`n未检测到任何开放端口" -ForegroundColor Red
}

# 清理资源
$pool.Close()
$pool.Dispose()

可以用 Windows PowerShell直接执行。上述文件存到D:盘,文件路径是 D:PortScanner.ps1,那么可以用以下命令执行。

PS C:\Windows\system32> cd D:\soft\
PS D:\soft> .\PortScanner.ps1 -target 192.168.1.1 -startPort 79 -endPort 1000 -threads 30 timeout=500

参数定义:
startPort 开始端口
endPort 结束端口
threads 线程数量(线程越多,速度越快)
timeout 响应超时时间,毫秒


飘雪的浮云
54 声望2 粉丝

引用和评论

0 条评论