如何在不使用端口扫描器的情况下在Erlang中识别服务器/网络接口上的所有侦听端口



给定一个网络接口(inet_x), erlang中是否有一种本地方法来识别该接口上的所有侦听端口?

可以实现一个网络扫描函数,扫描这样一个网络接口的ip地址,从端口a到B (scanner:scan(IpToScan, StartPort, EndPOrt)),但它是相当慢的实现这些结果。

是否有更快/更原生的方法来实现这一点?我特别感兴趣的是获得一个显示类似于shell命令的结果的列表。该结果的重要方面还在于端口表明它是如何侦听的,例如(*)表示所有DNS/ip-address

netstat - a | grep LISTEN

tcp4       0      0  *.15672                *.*                    LISTEN   
tcp46      0      0  *.52791                *.*                    LISTEN     
tcp46      0      0  *.8181                 *.*                    LISTEN     
tcp46      0      0  *.http-alt             *.*                    LISTEN     
tcp46      0      0  *.sun-as-jmxrmi        *.*                    LISTEN     
tcp46      0      0  *.websm                *.*                    LISTEN     
tcp46      0      0  *.eforward             *.*                    LISTEN     
tcp46      0      0  *.9095                 *.*                    LISTEN     
tcp4       0      0  *.6379                 *.*                    LISTEN     
tcp6       0      0  localhost.55202        *.*                    LISTEN

此外,虽然使用os模块很容易,但我想避免使用它。捕获netstat -a的操作系统结果很容易,但不是跨平台的。

我的理解是,netstat用于在内核网络数据结构上提供一个友好的、可查询的界面,因此,所有显示的信息都将来自本地计算机,而不是远程计算机。nmap,如果我正确地将您的请求理解为需要远程计算机的信息,则与scanner:scan/3更内联。我对它的内部细节不太清楚,但是在nmap使用ICMP的地方,您可以模仿gen_icmp或更普遍地使用procket。

也就是说,如果您有一个简单的scanner:scan/3实现,但发现它太慢,您是否考虑并行运行一个或所有扫描ping ?并行映射实现可能会达到这个目的,或者您可以使用OTP和单个请求者进程/多个工作进程模型,其中每个工作进程执行缓慢的ping,并在完成时向请求者进程发送消息。

相关内容

最新更新