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 响应超时时间,毫秒
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。