如何在 Powershell 中自动执行 Telnet 端口检查?
Posted
技术标签:
【中文标题】如何在 Powershell 中自动执行 Telnet 端口检查?【英文标题】:How can I automate Telnet port checking in Powershell?` 【发布时间】:2014-12-03 08:55:31 【问题描述】:我目前正在尝试编写一个脚本,用于查询 AD 以获取计算机列表,ping 计算机以确定哪些计算机仍处于活动状态,然后远程登录到所有可 ping 计算机上的特定端口。我正在寻找的输出是 AD 中可 ping 的计算机的完整列表,我无法通过 telnet 连接到所述端口。
我读过thesefewquestions,但他们并没有完全理解我想要做什么。我只是想看看telnet连接是否成功,无需进入telnet(或自动退出telnet),然后继续下一台机器测试。我脚本的 AD 和 ping 部分已设置,我只是被困在这里。我尝试过的事情并没有按计划进行。
如果需要,这里是脚本第一部分的代码:
Get-ADComputer -Filter * -SearchBase 'DC=hahaha,DC=hehehe' | ForEach
$computerName = $_.Name
$props = @
ComputerName = $computerName
Alive = $false
PortOpen = $false
If (Test-Connection -ComputerName $computerName -Count 1 -Quiet)
$props.Alive = $true
【问题讨论】:
here 的简单代码示例怎么样。你必须尝试一些连接来测试端口是否打开。 感谢您的建议,马特!我添加了该代码(经过调整以适合我所拥有的),但它返回每台计算机都关闭了端口,我知道这不是真的。我是 telnet 和 powershell 的相对新手,但我在这里确信我需要使用 telnet 才能真正做出我需要的决定。telnet
命令的作用与@Matt 建议的代码完全相同。
要验证端口是否真的在目标机器上打开,在其上运行netstat -an | findstr LISTENING | findstr ":80"
。这里 80 是您要查找的端口,因此请将其更改为所需的端口。如果该命令列出了您的端口,那么问题将出在防火墙上,很可能是目标框上的 Windows 防火墙。
Good ol' 用户错误。在我弄清楚我做错了什么(变量定义)后,我得到了@Matt 建议工作的代码。谢谢你们的帮助,伙计们!
【参考方案1】:
将此代码改编为您自己的代码是最简单的方法。此代码示例来自 PowerShellAdmin wiki。收集您要检查的计算机和端口。然后尝试使用Net.Sockets.TcpClient
在每个端口上连接到该计算机。
foreach ($Computer in $ComputerName)
foreach ($Port in $Ports)
# Create a Net.Sockets.TcpClient object to use for
# checking for open TCP ports.
$Socket = New-Object Net.Sockets.TcpClient
# Suppress error messages
$ErrorActionPreference = 'SilentlyContinue'
# Try to connect
$Socket.Connect($Computer, $Port)
# Make error messages visible again
$ErrorActionPreference = 'Continue'
# Determine if we are connected.
if ($Socket.Connected)
"$Computer: Port $Port is open"
$Socket.Close()
else
"$Computer: Port $Port is closed or filtered"
# Apparently resetting the variable between iterations is necessary.
$Socket = $null
【讨论】:
【参考方案2】:这是一个完整的 powershell 脚本,它将:
1. read the host and port details from CSV file
2. perform telnet test
3. write the output with the test status to another CSV file
清单.csv
remoteHost,port
localhost,80
asdfadsf,83
localhost,135
telnet_test.ps1
$checklist = import-csv checklist.csv
$OutArray = @()
Import-Csv checklist.csv |`
ForEach-Object
try
$rh = $_.remoteHost
$p = $_.port
$socket = new-object System.Net.Sockets.TcpClient($rh, $p)
catch [Exception]
$myobj = "" | Select "remoteHost", "port", "status"
$myobj.remoteHost = $rh
$myobj.port = $p
$myobj.status = "failed"
Write-Host $myobj
$outarray += $myobj
$myobj = $null
return
$myobj = "" | Select "remoteHost", "port", "status"
$myobj.remoteHost = $rh
$myobj.port = $p
$myobj.status = "success"
Write-Host $myobj
$outarray += $myobj
$myobj = $null
return
$outarray | export-csv -path "result.csv" -NoTypeInformation
结果.csv
"remoteHost","port","status"
"localhost","80","failed"
"asdfadsf","83","failed"
"localhost","135","success"
【讨论】:
以上是关于如何在 Powershell 中自动执行 Telnet 端口检查?的主要内容,如果未能解决你的问题,请参考以下文章