网络上所有计算机的主机名发现

时间:2013-03-31 21:18:56

标签: linux networking mpi hostname

问题:我正在为分布式CPU / GPU模拟器开发图形前端。由于此模拟器使用MPI,因此需要一个主机文件,详细说明网络上使用的所有计算机的主机名,以便它知道要分配的计算机。由于我的应用程序的最终用户不是计算机科学家(甚至可能不是计算机知识),我不能指望他们知道/找到他们网络/集群上每台计算机的主机名。我想以编程方式执行此主机名发现,以便在应用程序启动时,用户可以看到可用的计算机,然后从中选择要运行的主机。如果可能的话,我希望这个解决方案是跨平台的,但由于模拟器目前包含一些Linux依赖项,我可以处理仅Linux的解决方案。

到目前为止我尝试了什么:我尝试使用nmap包来发现网络上的主机,使用nmap -sP <ip address range>这样的命令,使用该本地网络的IP地址范围。但是,它只转储主机的IP地址(而不是主机名)和我不确定如何将这些IP地址转换为ssh主机名(因为MPI使用ssh进行主机发现)。另外,我使用类似的方法,ping提供广播地址,并返回几乎相同的结果。

我为这个问题的广泛性以及所显示的代码缺乏道歉,但我对网络探测/编程不是很有经验,我甚至不确定从哪里开始。我试过谷歌搜索,但我无法找到合适的选项(可能是因为我缺乏经验导致我使用不正确的术语触发不正确的结果)我的背景主要是图形和用户界面编程,所以这有点超出我的舒适区。

1 个答案:

答案 0 :(得分:5)

SSH并不关心是否给出了要连接的主机名或IP地址(当有特定于主机的配置时,不确定是否适用)。大多数MPI实现也不关心,例如在Open MPI连接中,URI地址都是数字,因此具有IP的主机文件可以正常使用。另一方面,HTTP服务器关心的是虚拟主机事件,其中许多不同站点解析为相同的IP地址,但服务器通过Host HTTP头提供实际主机名。

未经请求的建议:通过ping查找主机很好,但它并不能保证您找到了运行SSH的计算机。您最好扫描打开端口22接受TCP连接的系统:

$ nmap -oX -sT -p22 <ip range>

-oX生成可轻松解析的XML输出。 -oG也是自动解析扫描结果的一种很好的格式。运行SSH也不一定意味着用户可以登录系统 - 例如,它可以是网络路由器或其他可远程管理的设备。还必须注意仅显示用户可以登录而不必提供密码的机器,例如,使用RSA / DSA公钥,否则启动MPI工作将是一项非常繁琐的任务。您可以使用以下内容测试每个发现的主机:

$ ssh -2 -o "PreferredAuthentications=gssapi-with-mic,hostbased,publickey" \
      <host> hostname

此命令基本上排除了所有交互式身份验证方法。如果连接成功,它将输出远程计算机的主机名。否则,您将从SSH客户端获得权限被拒绝错误和非零退出代码。