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

时间:2013-06-10 18:37:42

标签: erlang

鉴于网络接口(inet_x),erlang中是否有一种本地方式来识别此接口上的所有侦听端口?

可以实现网络扫描功能,从端口A到B(扫描仪:扫描(IpToScan,StartPort,EndPOrt))扫描此类网络接口的IP地址,但实现这些结果的速度相当慢。

是否有更快/更本土的方式来实现这一目标?我特别感兴趣的是获得一个表明类似于shell命令的结果的列表。此结果的导入方面还在于端口指示显示它是如何监听的,例如(*)表示所有DNS / IP地址

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的操作系统结果很容易,但不是跨平台的。

1 个答案:

答案 0 :(得分:0)

据我所知,netstat用于在内核网络数据结构上提供友好,可查询的界面,因此显示的所有信息都来自本地 - 从不远程 - 计算机。 nmap,如果我将您的请求视为需要正确地从远程计算机获取信息,则会更加符合scanner:scan/3。我对其内部细节含糊不清,但在nmap使用ICMP时,您可以使用gen_icmp模仿或更常用procket

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