检测TCP端口是否打开但无需连接

7

我被要求将使用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中才能使用。尽管如此,对于那些没有本帖中提到的独特要求的人来说,这也值得一提。


5
“Not connecting” 的本质意思是端口扫描——TCP 扫描在技术上确实会建立连接,而 SYN 或 FIN 扫描则不会。除非使用原始套接字,否则我认为您不能直接从 PowerShell 进行此操作,即使可以也不应该这样做。如果您需要这样做(或者确实需要),我建议使用 nmap (或者 nc 本身——有 Windows 版本,但精度各不相同)。 - Jeroen Mostert
1
当然,仅仅存在一个开放的TCP端口并不能保证任何打开它的东西此时能够提供任何有意义的服务。 - Damien_The_Unbeliever
1
可能nc -z的描述是误导性的/它只是意味着不发送数据。好吧,你链接的文章字面上说“不向它们发送任何数据”。 - Ansgar Wiechers
@AnsgarWiechers同意它说它没有发送数据...但似乎Connect的定义是可变的(例如,在此处查看有关未完成TCP连接握手的信息:https://www.varonis.com/blog/port-scanning-techniques/)-因此在他们的描述中存在假设/错误的空间。 - JohnLBevan
1
如果您仍在寻找答案,请尝试使用WSL,例如bash -c“nc <address> <port> -z” - Nico Nekoru
显示剩余2条评论
1个回答

1
使用 Test-NetConnection
Test-NetConnection -ComputerName $host -Port $port

输出看起来像这样:

ComputerName     : [computername]
RemoteAddress    : [remoteipaddress]
RemotePort       : 80
InterfaceAlias   : Ethernet 2
SourceAddress    : [sourceipaddress]
TcpTestSucceeded : True

Test-NetConnection文档

使用Tcp Client类(.Net):

 New-Object System.Net.Sockets.TcpClient($ip, $port)

输出:

Client              : System.Net.Sockets.Socket
Available           : 0
Connected           : True
ExclusiveAddressUse : False
ReceiveBufferSize   : 65536
SendBufferSize      : 64512
ReceiveTimeout      : 0
SendTimeout         : 0
LingerState         : System.Net.Sockets.LingerOption
NoDelay             : False

Tcp客户端文档


感谢@RobotScience。这些是测试端口是否开放的好方法,但不幸的是两者都需要连接到端口才能这样做。在超过99%的情况下,我认为这没问题;但是我想要避免这种情况。如果您对更详细级别的“未连接”是什么意思感兴趣,原始问题的评论中有一些很好的信息。 - JohnLBevan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接