我被要求将使用nc -z
的bash脚本转换为PowerShell。
这个网站告诉我nc -z
可以测试端口是否打开,而不连接。有没有一种方法可以用.Net实现呢?
其他信息
通常,要测试端口是否打开,我会使用.Net的TcpClient
创建一个连接;如果连接成功,则报告一切正常。以下是MVE:
$isConnected = $false
$client = New-Object -TypeName 'System.Net.Sockets.TcpClient'
try {
$client.Connect($host, $port)
$isConnected = $client.Connected
$client.GetStream().Close(); # handle bug in .net 1.1
$client.Close();
} catch {
$isConnected = $false
} finally {
if ($client.Dispose) {$client.Dispose()} # dispose method not available in all versions, so check before calling
}
然而,虽然它不发送数据,但它确实连接上了。
可能是因为 nc -z
的描述有误/它只是表示没有发送数据... 我也找不到任何证实的方法。
附注
根据最近几个回答,我想指出 Test-NetConnection
基本上使用了与上面提到的相同的 TcpClient
方法,所以也会"连接"。此外,在PS2中不可用 / 仅在Windows 8及以上的PSv4中才能使用。尽管如此,对于那些没有本帖中提到的独特要求的人来说,这也值得一提。
nmap
(或者nc
本身——有 Windows 版本,但精度各不相同)。 - Jeroen MostertConnect
的定义是可变的(例如,在此处查看有关未完成TCP连接握手的信息:https://www.varonis.com/blog/port-scanning-techniques/)-因此在他们的描述中存在假设/错误的空间。 - JohnLBevanbash -c“nc <address> <port> -z”
。 - Nico Nekoru