2013-03-31 42 views
4

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

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

我对这个问题的广泛性质和缺乏代码表示歉意,但我对网络探测/编程不是很有经验,我真的不知道从哪里开始。我试着用google搜索,但是我找不到合适的选项(可能是因为我的经验不足导致我使用不正确的术语触发不正确的结果)。我的背景主要是图形和用户界面编程,所以这比我的舒适区略微。

回答

5

如果给定主机名或IP地址以连接到SSH(不确定是否适用于具有主机特定配置的情况),SSH不在乎。大多数MPI实现并不在意,例如在Open MPI连接中,URIs地址都是数字的,所以带有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客户端获得权限被拒绝的错误和非零退出代码。